Google Cloud Pub/Sub 重试次数
Posted
技术标签:
【中文标题】Google Cloud Pub/Sub 重试次数【英文标题】:Google Cloud Pub/Sub Retry Count 【发布时间】:2016-11-30 15:41:31 【问题描述】:我们正在从一个不稳定的消息队列服务转移到 Google 的 NodeJS 中的 Pub Sub。它似乎运行良好,但我们希望包括错误处理。
我们希望限制特定消息的重试次数,例如在我们的测试环境中重试 10 次,在生产环境中重试 100 次。现在,如果一条消息失败了 10 次(在测试中),而不是将它留在我们的队列中并继续处理并失败 7 天,我们希望将其移至单独的错误队列并向我们发送电子邮件。
我们目前在之前的消息队列中设置了所有这些,但我们还没有为每条消息找到 Google 的 Pub Sub 重试计数属性。有谁知道这是否存在?
我们确实在 Google App Engine 中使用了任务队列,它们拥有我们需要的一切,但 Google 的 pub sub 似乎缺少很多东西。我们确实需要任何解决方案都在 Node 中。
【问题讨论】:
【参考方案1】:2020 年 4 月 21 日更新:截至今天,Cloud Pub/Sub 的 dead letter queue feature 已发布。此功能允许设置尝试传递消息的最大次数,然后指定将传递次数超过该次数的消息发布到的主题。启用后,该功能还会将传递尝试的次数显示为一个字段。例如,它在Node.js 中传递给订阅者回调的消息的deliveryAttempt
属性中公开。
上一个答案
Cloud Pub/Sub 对重试向订阅者传递消息的次数没有限制。如果您的订阅者从未在确认截止日期内确认该消息,它将被重新传递,直到该消息在 7 天后过期。
如果您想停止接收这些消息,那么您需要在某个时候确认它们。如果您想防止订阅者无法处理的“死亡消息”,我建议您采取以下措施:
跟踪数据库中的消息失败计数,以消息 ID 为关键字。希望故障不会频繁发生,因此该数据库不应太大,并且只有在实际发生故障时才会对其进行查询。
当消息失败时,查询数据库并查看之前发生了多少次失败。增加计数器,如果计数低于您的阈值,则不确认消息。
如果消息失败次数超过您的阈值,请将消息发布到单独的“失败消息”主题,发送电子邮件并确认消息。
如有必要,在首先解决导致消息失败的问题后,有一种方法将消息从“失败的消息”主题发布回您的主要主题。
您现在将消息保存在单独的主题中(7 天或直到您确认),并且该消息将不会重新发送给您的主要主题的订阅者。
【讨论】:
感谢卡马尔的回复。我认为你的回应会奏效,因为我们会以不同的方式实施它。由于在数据库中保存消息失败计数似乎是无用的信息,特别是如果实际消息消失了,我们将在每个对象上存储一个入队或发布日期。如果对象在主题中停留一天或更长时间,我们会将消息添加到数据库并从主题中确认/删除它。这使我们可以静默日志、限制重试次数并让失败的消息在超过 7 天的时间内可见和可用。 我们意识到 App Engine 中的任务队列本来是完美的,但 Node.js 不支持它们。再次感谢您的回复! appengine 中的任务队列有一个 REST API(尽管仍然带有 beta 标签)cloud.google.com/appengine/docs/python/taskqueue/rest @marcadian 是的!我们将任务队列用于当前用 Python 编写的其他项目。 NodeJS 的任务队列仍在处理中,在可预见的将来它们将保持私有 alpha。【参考方案2】:在 python 中,查看 .execute() 上的“num_retries”参数:
pubsub_client.projects().topics().publish(topic='projects/xxxx',body=body).execute(num_retries=0)
不确定 Node.JS 中是否存在相同的东西,但我希望这能指引您正确的方向。
【讨论】:
嗨 Aerodyno,这让我非常兴奋。我也在 Python 文档中看到了它,但是当我们查看 Python 和 NodeJS 的 Github 时,它根本没有实现或记录。 num_retries 属性将影响发布失败时重试的次数,例如,如果发布者由于某种原因无法访问 Cloud Pub/Sub。如果订阅者无法处理和确认消息,它不会影响向订阅者传递消息的次数。以上是关于Google Cloud Pub/Sub 重试次数的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud Functions 仅在成功时确认 Pub/Sub(GCP 解决的问题)
如何通过转发到死信主题来限制 Google Pub/Sub 交付尝试?
访问 Google Cloud Storage 触发事件“Pub/Sub”?
javascript Google Cloud函数用于在pub / sub和pub / sub到Big查询中发布数据