订阅 Pub/Sub 主题的最佳实践

在订阅过程中,订阅方客户端接收来自 Pub/Sub 主题的消息。下面是一些有关订阅 Pub/Sub 的最佳实践。

本文档假定您已熟悉在订阅方客户端中订阅 Pub/Sub 主题并接收消息的过程。

如果您刚接触 Pub/Sub,请参阅某个快速入门指南,了解如何使用控制台Google Cloud CLI客户端库运行 Pub/Sub。

选择合适的订阅

Pub/Sub 提供标准订阅,例如推送拉取订阅。除了标准订阅之外,Pub/Sub 还提供导出订阅,可让您直接将消息存储到Google Cloud 资源,而无需将 Dataflow 用作中介。例如,BigQuery 订阅会将消息存储在 BigQuery 表中。

建议在以下场景中使用推送订阅:

  • 您不得在订阅方应用中添加任何将客户端库作为依赖项导入的代码。

  • 订阅者客户端无法发出任何出站请求。

  • 您希望使用同一实例处理来自不同主题和订阅的消息,并且订阅方客户端不知道订阅列表。

对于一般情况,我们建议使用高级客户端库。如果您改用单元操作符拉取,请勿将 returnImmediately 设置为 true。将其设置为 true 会对拉取性能产生不利影响。returnImmediately 字段现已废弃。

先处理消息,然后再确认消息

默认情况下,Pub/Sub 会在消息被确认后从订阅中舍弃消息。如果您未在发送确认之前处理消息,并且处理失败,则该服务不会重新传送消息。但是,如果您已配置保留已确认的消息或主题保留,并执行了查找操作,则不受此影响。

如果您有高延迟订阅方,则可能需要为流量控制租约管理设置自定义值。

针对瞬时流量峰值配置订阅方流量控制

通过订阅方流量控制,您可以防止订阅方因流量激增而超载。这可以让自动扩缩机制有时间响应增加的负载,也可以将负载处理时间延长到更长的时间。前一种方法可缩短延迟时间,而后一种方法可节省费用。

如需配置流量控制,您必须为 maximum outstanding messagestotal outstanding message bytes 设置适当的值。这些流控制变量的默认值和变量名称可能会因客户端库而异。

  • 待处理消息的数量上限用于定义向客户端传送的消息数量上限,其中 Pub/Sub 尚未收到确认或否定确认。

  • 待处理消息总字节数用于定义传送给客户端且 Pub/Sub 尚未收到确认或否定确认的消息的总大小上限。

如果超出其中任一选项的限制,订阅方客户端将不会拉取更多消息。此行为会一直持续,直到已拉取的消息收到确认或否定确认为止。这样,您就可以在吞吐量与运行更多订阅者相关的费用之间进行权衡。

订阅中有序消息传递的最佳实践

如果您使用消息排序,请确保:

  • 选择 StreamingPull 或 Pull 订阅。对于推送订阅,Pub/Sub 一次只能支持每个排序键有一个待处理消息。在这种情况下,发送并行推送请求类似于针对同一排序键发送多批消息,以便同时拉取订阅者。因此,对于经常使用相同排序键发布多条消息或延迟时间极其重要的主题,不建议使用推送订阅。

  • 在订阅中启用消息排序。在发布端,如果您发送的消息带有排序键且位于同一区域,则可以将订阅者配置为按顺序接收这些消息。在订阅方,仅为您希望接收有序消息的订阅启用消息排序属性。根据媒体资源状态,附加到主题的每个订阅都可以确定自己是否需要有序传送,而不会相互影响。

  • 按顺序确认消息。使用有序传送时,系统会按排序键处理早期消息的确认,然后再处理后续消息的确认。例如,如果消息 1、2 和 3 具有相同的排序键,并且您收到了所有这些消息,但仅确认了消息 3,那么在消息 1 和 2 也得到确认之前,该服务不会将消息 3 视为已确认。如果系统从未收到消息 1 和 2 的确认,则会重新传送消息 1、2 和 3。

最佳做法摘要

下表总结了本文档中建议的最佳实践:

主题 任务
选择订阅类型 选择适合您业务需求的订阅类型。如果您的订阅支持,还应使用高级客户端库。
重放已确认的消息 请先处理消息,然后再确认消息。或者,请进行跳转操作配置,以免丢失已确认的消息。
流控制 在订阅者设置中配置流控制,以确保在自动扩缩生效或时间过后之前,订阅者不会过载。
对消息排序 使用有序消息传递时,请选择 StreamingPull 或 Pull,在订阅中启用消息排序,并按顺序确认消息。

后续步骤