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查询中发布数据

Google Cloud Pub/Sub - Cloud Function & Bigquery - 数据插入未发生

Google Cloud 上使用 Pub/Sub 的主/从模式