订阅重试政策

订阅者可能会因多种原因而无法处理消息。例如,订阅者在检索必要数据时可能会遇到暂时性问题,或者可能会收到格式异常的消息。

如果 Pub/Sub 尝试传送消息,但订阅者无法确认消息,Pub/Sub 会自动尝试重新发送消息。此重新传送尝试称为订阅重试政策。此功能无法开启或关闭。不过,您可以选择要使用的重试政策类型。

准备工作

  • 创建主题,以便与包含订阅重试策略的订阅搭配使用。

所需的角色

如需获得管理主题和订阅所需的权限,请让您的管理员为您授予项目的 Pub/Sub Editor(roles/pubsub.editor) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

您可以在项目级层和个别资源级层配置访问权限控制。您可以在一个项目中创建订阅,并将其附加到位于另一个项目中的主题。确保您拥有每个项目所需的权限。

重试政策的类型

首次创建和配置订阅时,您可以选择使用以下重试政策之一:立即重新传送指数退避。默认情况下,订阅使用立即重新传送。

立即重新配送

默认情况下,Pub/Sub 会立即尝试重新发送消息(并且可能会发送给同一订阅者客户端)。不过,如果阻止消息确认的条件没有改变,立即重新传送可能会导致问题。在这种情况下,Pub/Sub 可能会重新发送多条无法确认的消息。

为了解决立即重新传送问题,Pub/Sub 允许您配置指数退避算法政策。

指数退避算法

借助指数退避算法,您可以在重试尝试之间逐步增加延迟时间。第一次传送失败后,Pub/Sub 会等待最短退避时间,然后再重试。对于每次连续的消息失败,系统会延长延迟时间,直至达到最长延迟时间(0 秒和 600 秒)。

最大和最小延迟间隔不固定,应根据应用的本地因素进行配置。

请注意以下有关指数退避算法的注意事项:

  • 以下操作会触发指数退避:
    • 收到否定确认时。
    • 消息的确认截止时间到期。
  • 指数退避仅应用于每条消息,而不是应用于订阅中的所有消息(全局)。
  • 在使用指数退避算法时,即使之前的消息收到了否定确认,Pub/Sub 也会继续传送其他消息(除非您使用的是按序传送消息)。

使用重试政策延迟部分消息的传送和处理,以应对在传送时暂时无法处理某些消息的情况。此功能会尽最大努力进行应用,并且系统会单独评估每条消息的重试政策。

我们不建议使用此功能来故意延迟消息传递。如果您对配置了重试政策的订阅中的大量消息进行否定确认 (nack),则其中一些消息可能会以较短或零退避时间进行传送。如果您对大量消息进行否定确认,Pub/Sub 也可能会减慢所有消息的传送速度。

如果您需要安排交付,请考虑使用 Cloud Tasks

配置指数退避算法

控制台

创建新订阅时,您可以执行以下步骤来配置指数退避算法重试政策:

  1. 在 Google Cloud 控制台中,前往 Pub/Sub 订阅页面。

前往订阅页面

  1. 点击创建订阅

  2. 订阅 ID 字段中,输入一个名称。

如需了解如何命名订阅,请参阅主题或订阅命名指南

  1. 从下拉菜单中选择或创建一个主题。

订阅将接收来自该主题的消息。

  1. 选择投放类型

  2. 重试政策下,选择在指数退避算法后重试

  3. 输入介于 0 到 600 秒之间的最短退避时间最长退避时间

最短退避时间的默认值为 10 秒,最长退避时间的默认值为 600 秒。

  1. 点击创建

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

替换以下内容:

  • SUBSCRIPTION_ID:订阅的唯一 ID。
  • TOPIC_ID:您要将订阅附加到的主题的 ID。
  • MIN_RETRY_DELAY:订阅的最小退避延迟时间。
  • MAX_RETRY_DELAY:订阅的最大退避延迟时间。

后续步骤