订阅者可能会因各种原因而无法处理消息。对于 例如,在检索处理数据所需的数据时,可能会出现暂时性问题。 消息。或者,消息采用订阅者意料之外的格式。
本页面介绍了如何使用 订阅重试政策,或者将未传送的消息转发到死信主题 (也称为死信队列)。
请注意,Dataflow 不支持这些功能。如需了解详情,请参阅 Dataflow 文档的不支持的 Pub/Sub 功能部分。
订阅重试政策
如果 Pub/Sub 尝试传送消息,但订阅者无法传送 确认后,Pub/Sub 会自动尝试重新发送消息。 这种重新提交尝试称为订阅重试政策。这不是 一项可开启或关闭的功能不过,您可以选择 政策。
首次创建和配置订阅时,您可以选择使用一项 以下重试政策之一:立即重新提交或指数退避算法。 默认情况下,订阅会立即重新提交。
立即重新提交
默认情况下,Pub/Sub 会尝试立即重新发送该消息(并且 也可能发送到同一订阅者客户端)。然而,如果阻止 确认消息尚未更改,立即重新提交可能会导致问题。 在这种情况下,Pub/Sub 可能会重新发送多条消息 包含无法识别的内容
为了解决立即重新提交的问题,Pub/Sub 允许您配置 指数退避算法政策。
指数退避算法
指数退避算法可让你在重试之间的延迟时间逐渐变长 错误。第一次传送失败后,Pub/Sub 会等待 重试之前必须等待的最短退避时间。对于每一条连续失败的消息, 增加的时间,最多为最大延迟(0 和 600 秒)。
最大和最小延迟间隔不固定,应根据应用的本地因素进行配置。
请注意以下有关指数退避算法的注意事项:
- 执行以下操作会触发指数退避算法:
- 收到否定确认时。
- 消息的确认截止期限到期。
- 指数退避算法仅适用于每条消息, 订阅(全球)中的消息。
- 在使用指数退避算法的情况下,Pub/Sub 仍会 其他消息,即使之前的消息收到了负面确认 (除非您使用的是有序邮件递送)。
使用重试政策延迟部分内容的传送和处理 消息,以应对发生暂时无法处理某些消息的情况 。系统会尽最大努力使用此功能,并且每条消息 重试政策。
我们不建议使用此功能故意延迟 消息传送。如果您发现大量负面反馈, 则有可能 部分消息在传送时没有退避或没有退避。 如果出现以下情况,Pub/Sub 还可能会减慢所有消息的传送速度: 大量消息
如果您需要安排送货时间,可以考虑使用 Cloud Tasks。
配置指数退避算法
控制台
创建新订阅时,您可以执行以下步骤来配置指数退避算法重试政策:
gcloud
如需使用指数退避算法重试政策创建新订阅,请使用下面显示的标志运行 gcloud pubsub create
命令:
gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --min-retry-delay=MIN_RETRY_DELAY \ --max-retry-delay=MAX_RETRY_DELAY
死信主题
如果 Pub/Sub 服务尝试传送消息,但 则 Pub/Sub 可以转发 无法传送的消息。
死信主题如何与 Pub/Sub 搭配使用
死信主题是一种订阅属性, 不是主题属性。这意味着您在创建死信主题时 订阅,而不是在创建主题时启用。
如果您创建死信主题,则可以设置以下内容 订阅属性:
传送尝试次数上限:一个数值,表示 Pub/Sub 的 代表特定消息。如果订阅方客户端无法确认 在指定的传送尝试次数内发送,则视为 转发至死信主题。
- 默认值 = 5
- 最大值 = 100
- 最小值 = 5
Project with the Dead-letter topic:如果死信主题位于 项目与订阅不同,则必须使用 死信主题将死信主题设为与以下主题不同的主题: 关联了该订阅。
如何计算发送尝试次数上限
当死信主题出现以下情况时,Pub/Sub 只会计算传送尝试次数 配置正确,且包含正确的 IAM 权限。
传送尝试次数上限是近似值,因为 Pub/Sub 会尽可能转发无法传送的消息。
系统跟踪的邮件递送尝试次数也可能会重置为零, 特别是对于具有非活跃订阅者的拉取订阅。 因此,消息可能会传送到订阅者客户端 次。
配置死信主题
如需配置死信主题,源主题必须先拥有订阅。 您可以在创建订阅时指定死信主题,也可以 更新现有订阅以包含死信主题。
以下是在订阅上启用死信的工作流程。
创建死信主题。该主题与源主题无关。
在源主题的订阅上设置死信主题。
为避免丢失死信主题中的邮件,请至少附加另一个 订阅死信主题。辅助订阅会接收消息 死信主题
为 Pub/Sub 授予 Publisher 和 Subscriber 角色 服务账号。如需了解详情,请参阅 授予转发权限。
为新订阅设置死信主题
您可以使用 Google Cloud 控制台、Google Cloud CLI、客户端库或 Pub/Sub API。
控制台
如需创建订阅并设置死信主题,请完成以下步骤:
在 Google Cloud 控制台中,进入订阅页面。
点击创建订阅。
输入订阅 ID。
从下拉菜单中选择或创建一个主题。
订阅将接收来自该主题的消息。
在死信部分,选择启用死信。
从下拉菜单中选择或创建死信主题。
如果选定的死信主题没有订阅,系统会提示 创建一个。
在传送尝试次数上限字段中,指定一个 5 到 100 之间的整数。
点击创建。
详细信息面板会显示可用操作项的列表。如果存在 个项目显示错误图标
,点击 解决相应问题的操作项。
gcloud
如需创建订阅并设置死信主题,请使用 gcloud pubsub subscriptions create
命令:
gcloud pubsub subscriptions create subscription-id \ --topic=topic-id \ --dead-letter-topic=dead-letter-topic-name \ [--max-delivery-attempts=max-delivery-attempts] \ [--dead-letter-topic-project=dead-letter-topic-project]
C++
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C++ 设置说明进行操作。如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
Ruby
在尝试此示例之前,请按照Ruby Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub Ruby API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
为现有订阅设置死信主题
您可以使用 Google Cloud 控制台、Google Cloud CLI、客户端库或 Pub/Sub API。
控制台
如需更新订阅并设置死信主题,请完成以下步骤。
在 Google Cloud 控制台中,进入订阅页面。
在要更新的订阅旁边,点击更多操作more_vert。
在上下文菜单中,选择编辑。
在死信部分,选择启用死信。
从下拉菜单中选择或创建一个主题。
如果所选主题没有订阅,系统会提示您创建一个订阅。
在传送尝试次数上限字段中,指定 5 到 100 之间的整数。
点击更新。
详细信息面板会显示可用操作项的列表。如果存在 个项目显示错误图标
,点击 解决相应问题的待办项。
gcloud
如需更新订阅并设置死信主题,请使用 gcloud pubsub subscriptions update
命令:
gcloud pubsub subscriptions update subscription-id \ --dead-letter-topic=dead-letter-topic-name \ [--max-delivery-attempts=max-delivery-attempts] \ [--dead-letter-topic-project=dead-letter-topic-project]
C++
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C++ 设置说明进行操作。如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
Ruby
在尝试此示例之前,请按照Ruby Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub Ruby API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
授予 IAM 角色以使用死信主题
如需将无法传送的消息转发到死信主题,Pub/Sub 必须具有执行以下操作的权限:
- 将消息发布到主题。
- 确认消息,这会将其从订阅中移除。
Pub/Sub 会为每个项目创建并维护一个服务账号:service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com
。您可以通过分配
发布商和
订阅者角色。
控制台
要授予 Pub/Sub 将消息发布到 死信主题,请完成以下步骤:
在 Google Cloud 控制台中,进入订阅页面。
点击死信主题的订阅的名称。
点击死信标签页。
如需分配发布者角色,请点击授予发布者角色。如果 已成功分配发布商角色,您会看到蓝色对勾标记
。如需分配订阅者角色,请点击授予订阅者角色。如果 已成功分配发布商角色,您会看到蓝色对勾标记
。
gcloud
如需授予 Pub/Sub 将消息发布到死信主题的权限,请运行以下命令:
PUBSUB_SERVICE_ACCOUNT="service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud pubsub topics add-iam-policy-binding dead-letter-topic-name \ --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\ --role="roles/pubsub.publisher"
如需授予 Pub/Sub 确认转发的无法传送的消息的权限,请运行以下命令:
PUBSUB_SERVICE_ACCOUNT="service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud pubsub subscriptions add-iam-policy-binding subscription-id \ --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\ --role="roles/pubsub.subscriber"
跟踪传送尝试
为订阅启用死信主题后,每一条消息 具有一个字段,用于指定 尝试发送时间:
从拉取订阅接收的消息包括
delivery_attempt
字段。从推送订阅接收的消息包括
deliveryAttempt
字段。
以下示例展示了如何获取传送尝试次数:
C++
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C++ 设置说明进行操作。如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
C#
在尝试此示例之前,请按照C# Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub C# API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Go
在尝试此示例之前,请按照Go Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub Go API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Java
在尝试此示例之前,请按照Java Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub Java API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
在尝试此示例之前,请按照Node.js Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub Node.js API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
PHP
在尝试此示例之前,请按照PHP Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub PHP API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
在尝试此示例之前,请按照Python Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub Python API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Ruby
在尝试此示例之前,请按照Ruby Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub Ruby API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
当 Pub/Sub 将无法传送的消息转发到死信主题时, 它会将以下属性添加到 消息:
CloudPubSubDeadLetterSourceDeliveryCount
:传送尝试次数 来源订阅CloudPubSubDeadLetterSourceSubscription
:来源的名称 订阅。CloudPubSubDeadLetterSourceSubscriptionProject
:需要修改配置的项目的名称 包含源订阅。CloudPubSubDeadLetterSourceTopicPublishTime
:显示消息时的时间戳 最初发布。CloudPubSubDeadLetterSourceDeliveryErrorMessage
:消息的原因 无法传送到原始目的地。该属性只存在 导出订阅。
监控转发的邮件
转发无法送达的消息后,Pub/Sub 服务会从订阅中移除消息。您可以使用 Cloud Monitoring。
如果您将订阅附加到死信主题,则这些消息会使用附加订阅的到期政策,而非具有死信主题属性的订阅的有效期。
subscription/dead_letter_message_count
指标用于记录 Pub/Sub 从订阅转发的无法传送的消息数量。
如需了解详情,请参阅监控转发的无法传送的消息。
移除死信主题
如需停止转发无法传送的消息,请从订阅中移除死信主题。
您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Pub/Sub API。
控制台
如需从订阅中移除死信主题,请完成以下步骤:
在 Google Cloud 控制台中,进入订阅页面。
在订阅列表中,点击订阅旁边的 more_vert 进行更新。
从上下文菜单中选择修改。
在死信部分,清除启用死信。
点击更新。
gcloud
如需从订阅中移除死信主题,请使用 gcloud pubsub subscriptions update
命令和 --clear-dead-letter-policy
标志:
gcloud pubsub subscriptions update subscription-id \ --clear-dead-letter-policy
C++
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C++ 设置说明进行操作。如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
Ruby
在尝试此示例之前,请按照Ruby Pub/Sub 快速入门: 客户端库。 有关详情,请参阅 Pub/Sub Ruby API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
价格
Pub/Sub 服务转发无法传送的消息时,您需要支付以下费用:
- 向与包含死信主题的项目相关联的结算账号计入的发布费用。
- 向结算账号收取的出站邮件的订阅费用 与包含死信主题的订阅的项目相关联 属性。
如果您设置了订阅的死信主题属性,但 消息存储位置政策 死信主题主题不允许包含相应订阅的区域; 还需要支付出站消息的发布费用。
出站消息的发布费用将计入包含 死信主题要了解详情,请参阅价格。