订阅者可能会因多种原因而无法处理消息。例如,订阅者在检索必要数据时可能会遇到暂时性问题,或者可能会收到格式异常的消息。
如果 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。
配置指数退避算法
控制台
创建新订阅时,您可以执行以下步骤来配置指数退避算法重试政策:
- 在 Google Cloud 控制台中,前往 Pub/Sub 订阅页面。
点击创建订阅。
在订阅 ID 字段中,输入一个名称。
如需了解如何命名订阅,请参阅主题或订阅命名指南。
- 从下拉菜单中选择或创建一个主题。
订阅将接收来自该主题的消息。
选择投放类型。
在重试政策下,选择在指数退避算法后重试。
输入介于 0 到 600 秒之间的最短退避时间和最长退避时间。
最短退避时间的默认值为 10 秒,最长退避时间的默认值为 600 秒。
- 点击创建。
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
:订阅的最大退避延迟时间。