- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在运行分析管道。
这是我的主题和订阅:
gcloud pubsub topics create pipeline-input
gcloud beta pubsub subscriptions create pipeline-input-sub \
--topic pipeline-input \
--ack-deadline 600 \
--expiration-period never \
--dead-letter-topic dead-letter
这是我拉取消息的方式:
import { PubSub, Message } from '@google-cloud/pubsub'
const pubSubClient = new PubSub()
const queue: Message[] = []
const populateQueue = async () => {
const subscription = pubSubClient.subscription('pipeline-input-sub', {
flowControl: {
maxMessages: 5
}
})
const messageHandler = async (message: Message) => {
queue.push(message)
}
subscription.on('message', messageHandler)
}
const processQueueMessage = () => {
const message = queue.shift()
try {
...
message.ack()
} catch {
...
message.nack()
}
processQueueMessage()
}
processQueueMessage()
处理时间约为 7 秒。
这是许多类似的重复案例之一。相同的消息被传递 5 (!!!) 次到不同的 GCE 实例:
所有 5 次消息都被成功处理并 .ack()
ed。输出包含的消息比输入多 50%!我很清楚 "at least once" behavior ,但我认为它可能会复制 0.01% 的消息,而不是其中的 50%。
主题输入 100% 无重复。我通过云监控验证了主题输入法和未确认消息的数量。数字匹配:发布/订阅主题中没有重复项。
更新:
最佳答案
虽然 50% 的重复率肯定很高,但预计会有一些重复。第一个问题是,这些是发布端重复项还是订阅端重复项?前者是在重试发布同一消息时创建的,从而导致同一消息的多次发布。这些消息将具有不同的消息 ID。后者是由向订阅者重新发送相同消息引起的。这些消息具有相同的消息 ID(尽管不同的确认 ID)。
听起来您已经确认这些是订阅端重复项。因此,正如您提到的,可能的原因是确认截止日期已过期。问题是,为什么消息会超过确认期限?需要注意的一点是,在使用客户端库时,订阅中设置的确认截止日期不是使用的那个。相反,客户端库会尝试根据客户端库设置和第 99 个百分位数的确认延迟来优化确认截止日期。然后它会续订消息的租约,直到max_lease_duration
property of the FlowControl
object。传递给 subscribe
方法。默认为一小时。
因此,为了让消息保持租用状态,客户端库必须能够向服务器发送modifyAckDeadline
请求。重复的一个可能原因是客户端无法发送这些请求,这可能是由于机器过载。运行这条管道的机器是否在做任何其他工作?如果是这样,它们可能在 CPU、内存或网络方面过载,无法发送 modifyAckDeadline
请求,也无法及时处理消息。
消息批处理也可能会影响您确认消息的能力。作为一种优化,Pub/Sub 系统存储对成批消息而不是单个消息的确认。因此,必须确认批处理中的所有消息才能确认所有消息。因此,如果您在一个批处理中有 5 条消息并确认了其中的 4 条,但随后不确认最后一条消息,则所有 5 条消息都将被重新传送。有一些缓存可以尽量减少这种情况,但仍有可能。有一个Medium post更详细地讨论了这一点(请参阅“消息重新传递和重复率”部分)。可能值得通过在收到消息后立即打印消息 ID 以及调用 ack
和 nack
。如果您的消息是批量发布的,则单个 nack 可能会导致重新发送更多消息。
批处理和重复之间的这种耦合是我们正在积极努力改进的。我希望这个问题在某个时候停止。同时,如果您可以控制发布者,则可以设置 max_messages
将批处理设置中的属性设置为 1 以防止对消息进行批处理。
如果这些都没有帮助,最好打开一个支持案例并提供一些重复消息的项目名称、订阅名称和消息 ID。工程师可以更详细地调查个别消息被重新传送的原因。
关于google-cloud-platform - 为什么我会收到 50% 的 GCP Pub/Sub 消息重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69421959/
我创建了一个训练作业,我从大查询中获取数据、执行训练和部署模型。我想在这两种情况下自动开始训练: 向数据集添加了 1000 多个新行 有时间表(例如,每周一次) 我检查了 GCP Cloud Sche
我遇到以下警告: WARNING: You do not appear to have access to project [$PROJECT] or it does not exist. 在本地运行
我正在使用 Google Cloud Platform,我必须使用 java 非 Web 应用程序访问云功能,就像我尝试使用 Google Cloud Storage JSON API 从 Googl
我的问题是第三方开发人员如何通过我的身份平台登录用户?我查看了文档,但一无所获。 本质上,我想将 Identity Platform 用作 OIDC 提供者,但我不知道这是否受支持。 最佳答案 Clo
在我去这里的过去 12 个小时左右: https://console.developers.google.com/apis/credentials?project=MYPROJECTNAME 我只是得
我正在尝试创建一个 python 脚本来在 linux 机器上自动安装和配置某些程序。 我的想法是使用平台和多处理库来询问系统信息(platform.system、platform.linux_dis
我正在尝试创建没有控制台网页的 Google Cloud Platform 项目,因为我考虑创建多个项目。 因为我查了gcloud,目前只支持project describe和list。 https:
我正在使用 Google Cloud Scheduler 调用外部应用程序。 Google Cloud Scheduler 使用 OIDC 身份验证并使用服务帐户。我只能从 Google 服务帐户 U
如何在我的 Google Cloud Platform 帐户上启用 Google Authenticator 双重身份验证?我在 Web 界面中上下查看了“IAM 和管理员”,但没有看到在帐户上启用
我们在 Google Cloud 上设置了一个虚拟机,并希望能够自动或计划打开和关闭它。 我们内部有自动脚本,之后可以完成工作,到目前为止,我在 google 的文献中读到的更多与这些实例有关,但我找
我试图删除一个 GCP 项目,但不断弹出以下错误。 Lien origin You cannot delete this project because it is linked with a Dia
我从 Google Domains 购买了一个域,称为 example.com。 我已订阅 G Suite 基本版并创建了一个 admin@example.com 帐户以在 GCP 上使用,而不是我的
我构建了一个包含许多并行进程的 AI Platform 流水线。每个流程都会在 AI Platform 上启动一个训练作业,如下所示: gcloud ai-platform jobs submit t
我们正在验证函数输入时方法参数不为空,但这不适用于 Platform::String (或 Platform.String ,C# 或 C++ 之间没有区别),因为它们用空实例重载空字符串的语义。 考
这个问题比我想来这里的问题要简单一些,但我一直在努力寻找答案,但我绝对不能—— 谷歌云平台 HTTP 函数是否支持路由参数,如此处? http://expressjs.com/en/guide/rou
我正在使用 Kubernetes,我正在尝试创建一个 ingress resource .我使用以下方法创建它: $ kubectl create -f my-ingress.yaml 我等了一会儿,
我是 Google Cloud 的新手,所以我希望得到一些有关“组织”的指导。 我可以将项目从一个“组织”转移到另一个“组织”吗?我正在我的个人 GSuite 组织下启动一些项目,但我必须将它们转移到
在 GET 操作中,我想从返回的集合中排除具有等于“true”的“存档”字段的实体。 我希望这是我的端点(如/users 或/companies)的默认设置,并且我想避免手动添加 URL 过滤器,如
实例模板对于创建托管实例组至关重要。事实上,托管实例组对于在 GCP 中创建自动扩缩组至关重要。 这个问题是另一个问题 question's answer 的一部分,这是关于构建一个自动缩放和负载平衡
我正在将 GCP 用于多个相同的项目。对于每个新项目我都需要一个1 个 GPU 的配额(Tesla K80)。为了申请增加我的GPU配额,我打开console并导航至“IAM 和管理”>“配额”。我在
我是一名优秀的程序员,十分优秀!