订阅者可能因各种原因而无法处理消息。例如,在检索处理消息所需的数据时,可能会出现暂时性问题。或者,消息的格式可能不是订阅者所期望的。
为了管理订阅者无法确认的无法传送的消息,Pub/Sub 可以将这些消息转发到死信主题(也称为死信队列)。
准备工作
为死信主题配置创建主题。
或者,如果您按照本页上的所有说明从头到尾操作,则可以在后续步骤中创建主题。
所需的角色
如需获得管理主题和订阅所需的权限,请让您的管理员为您授予项目的 Pub/Sub Editor (roles/pubsub.editor
) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
您可以在项目级层和个别资源级层配置访问权限控制。您可以在一个项目中创建订阅,并将其附加到位于另一个项目中的主题。确保您拥有每个项目的必需权限。
死信主题的运作方式
如果订阅者应用无法确认消息,Pub/Sub 会重试传送,直到确认时限到期或消息过期。在尝试传送消息的次数达到大致配置的次数后,Pub/Sub 可以将无法传送的消息转发到死信主题。
当 Pub/Sub 转发无法传送的消息时,它会将原始消息封装在新消息中,并添加用于标识源订阅的属性。然后,该消息会被发送到指定的死信主题。附加到死信主题的单独订阅随后可以接收这些转发的消息,以进行分析和离线调试。
传送尝试次数上限的计算方式
仅当死信主题配置正确且包含正确的 IAM 权限时,Pub/Sub 才会统计传送尝试次数。
传送尝试次数上限是近似值,因为 Pub/Sub 会尽力转发无法传送的消息。该服务可能会在尝试次数少于配置的次数后转发消息,也可能会在转发之前再尝试传送几次。
消息的跟踪传送尝试次数也可能会重置为零,尤其是对于具有不活跃订阅者的拉取订阅。因此,消息传送给订阅者客户端的次数可能会超过配置的传送尝试次数上限。
死信主题属性
您可以为死信主题设置以下订阅属性。
传送尝试次数上限:一个数值,表示 Pub/Sub 为特定消息进行的传送尝试次数。如果订阅者客户端在配置的传送尝试次数内无法确认消息,则该消息会被转发到死信主题。
- 默认值 = 5
- 最大值 = 100
- 最小值 = 5
含有死信主题的项目:如果死信主题与订阅位于不同项目中,则您必须指定含有死信主题的项目。将死信主题设置为与订阅附加到的主题不同的主题。
配置死信主题
以下步骤描述了使用死信主题的工作流。
创建一个主题(用作死信主题)。
为死信主题创建订阅。
为您的订阅启用死信。
将您之前创建的主题附加到订阅。
向您的 Pub/Sub 服务账号授予使用死信主题所需的角色。
创建要与死信主题搭配使用的主题
如果您已创建要用于订阅的主题,则可以跳过此步骤。
在 Google Cloud 控制台中,前往主题页面。
点击创建主题。
输入主题 ID,例如
my-test-topic
。保留默认订阅选项,然后点击创建。
为订阅设置死信主题
您可以为新订阅或现有订阅设置死信主题。
为新订阅设置死信主题
您可以使用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 客户端库的主要版本 (v2)。如果您仍在使用 v1 库,请参阅迁移到 v2 的指南。如需查看 v1 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 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 客户端库 v3。如果您仍在使用 v2 库,请参阅 迁移到 v3 的指南。如需查看 Ruby v2 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
Ruby
在尝试此示例之前,请按照《Pub/Sub 快速入门:使用客户端库》中的 Ruby 设置说明执行操作。如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
为现有订阅设置死信主题
您可以使用Google Cloud 控制台、gcloud 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 客户端库的主要版本 (v2)。如果您仍在使用 v1 库,请参阅迁移到 v2 的指南。如需查看 v1 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 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 客户端库 v3。如果您仍在使用 v2 库,请参阅 迁移到 v3 的指南。如需查看 Ruby v2 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
Ruby
在尝试此示例之前,请按照《Pub/Sub 快速入门:使用客户端库》中的 Ruby 设置说明执行操作。如需了解详情,请参阅 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 C# API 参考文档。
Go
以下示例使用 Go Pub/Sub 客户端库的主要版本 (v2)。如果您仍在使用 v1 库,请参阅迁移到 v2 的指南。如需查看 v1 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 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 客户端库 v3。如果您仍在使用 v2 库,请参阅 迁移到 v3 的指南。如需查看 Ruby v2 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
当 Pub/Sub 将无法递送的消息转发到死信主题时,它会向该消息添加以下属性:
CloudPubSubDeadLetterSourceDeliveryCount
:向源订阅的传送尝试次数。CloudPubSubDeadLetterSourceSubscription
:源订阅的名称。CloudPubSubDeadLetterSourceSubscriptionProject
:包含源订阅的项目的名称。CloudPubSubDeadLetterSourceTopicPublishTime
:相应消息最初发布时的时间戳。CloudPubSubDeadLetterSourceDeliveryErrorMessage
:邮件无法递送至原始目的地的原因。该属性仅适用于导出订阅。
监控转发的消息
转发无法送达的消息后,Pub/Sub 服务会从订阅中移除消息。您可以使用 Cloud Monitoring 监控转发的消息。
如果您将订阅附加到死信主题,则这些消息会使用附加订阅的到期政策,而非具有死信主题属性的订阅的有效期。
subscription/dead_letter_message_count
指标用于记录 Pub/Sub 从订阅转发的无法传送的消息数量。
如需了解详情,请参阅监控转发的无法传送的消息。
移除死信主题
如需停止转发无法传送的消息,请从订阅中移除死信主题。
您可以使用Google Cloud 控制台、gcloud 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 客户端库的主要版本 (v2)。如果您仍在使用 v1 库,请参阅迁移到 v2 的指南。如需查看 v1 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 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 客户端库 v3。如果您仍在使用 v2 库,请参阅 迁移到 v3 的指南。如需查看 Ruby v2 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
Ruby
在尝试此示例之前,请按照《Pub/Sub 快速入门:使用客户端库》中的 Ruby 设置说明执行操作。如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
如需向 Pub/Sub 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
价格
Pub/Sub 服务转发无法传送的消息时,您需要支付以下费用:
- 向与包含死信主题的项目相关联的结算账号计入的发布费用。
- 向与包含具有死信主题属性的订阅的项目相关联的结算账号收取的出站消息订阅费用。
如果您设置了订阅的死信主题属性,但死信主题的消息存储位置政策不允许包含该订阅的区域,则还需要支付出站消息的发布费用。
出站消息的发布费用将计入包含死信主题的项目。要了解详情,请参阅价格。
## 后续步骤