排查标准主题问题

本文档提供了一些有关向标准 Pub/Sub 主题发布消息时的常见问题排查提示。

详细了解如何发布针对主题的消息以及各种不同的功能。

发布延迟时间较长

发布延迟时间是指完成发布商客户端发出的发布请求所需的时间。发布延迟时间不同于端到端传送延迟时间,后者是指发布到 Pub/Sub 的消息传送到订阅方客户端所需的时间。您可能会发现发布延迟时间或端到端延迟时间较长,即使另一种延迟时间类型的值较低也是如此。发布延迟时间可能会出现在 Pub/Sub 发布方客户端、客户端和 Pub/Sub 后端之间的传输过程中,或在 Pub/Sub 后端。您可以使用 topic/send_request_latencies 指标检查 Pub/Sub 后端中产生的发布延迟时间。后端发布延迟时间较长可能与以下因素有关:

  • Pub/Sub 专为实现低延迟、高吞吐量传送而设计。如果主题的吞吐量较低,与该主题关联的资源可能需要更长时间才能初始化。

  • 如果您使用消息存储政策,则可能会影响对主题和订阅的请求的整体延迟时间。请查看使用此配置的性能和可用性影响

如果发布商客户端观察到的发布延迟时间明显高于指标中反映的时间,则可能表明存在以下客户端因素之一:

  • 请确保您不是每次发布时都创建新的发布商。建议为每个应用的每个主题使用单个发布方客户端来发布所有消息。启动新的发布方对象和添加新线程会产生延迟开销。如果您使用的是 Cloud Run functions 函数来发布消息,请注意,调用也可能会影响发布延迟时间。

  • 如果您发现默认重试设置无法满足您的使用情形,请进行相应调整。不过,请验证新值是否不太高。了解如何配置重试请求

请注意,发布延迟时间过长可能会导致 DEADLINE_EXCEEDED 错误,下一部分将对此进行讨论。

发布操作失败并显示 DEADLINE_EXCEEDED

发布请求期间出现 DEADLINE_EXCEEDED 错误表示请求未能在分配的时间内完成。这可能由多种因素导致,例如请求未到达 Pub/Sub 服务或影响请求的性能问题。

如需验证发布请求是否已到达 Pub/Sub 服务,请使用按 response_code 分组的 topic/send_request_count 指标监控主题。此指标有助于确定请求是否在到达 Pub/Sub 主题之前失败。如果该指标为空,则表示存在外部因素阻止消息到达 Pub/Sub 服务。此外,为排除间歇性问题的可能性,请使用前面提到的 topic/send_request_count 指标图表或 Google Cloud 控制台中的API 和服务页面检查错误率。如果错误率非常低,则可能是间歇性问题。

如果请求到达 Pub/Sub,以下是导致发布操作失败并出现 DEADLINE_EXCEEDED 错误的一些可能原因:

客户端瓶颈

发布失败可能是由客户端瓶颈导致的,例如托管发布商客户端的虚拟机内存不足、CPU 压力过大、线程运行状况不佳或网络拥塞。如果 Publish 调用返回 DEADLINE_EXCEEDED,则可能是因为异步 Publish 调用加入队列的速度比它们被发送到服务的速度更快,这会逐渐增加请求延迟时间。此外,请检查以下各项是否有助于确定系统中可能存在的瓶颈:

  • 检查发布消息的速度是否快于客户端发送消息的速度。通常,每个异步 Publish 调用都会返回一个 Future 对象。如需跟踪等待发送的消息数量,请存储要通过每个 Publish 调用发送的消息数量,并仅在 Future 对象的回调中将其删除。

  • 确保运行发布者的机器与 Google Cloud 之间有足够的上传带宽。开发 Wi-Fi 网络通常具有 1-10 MBps 的带宽,即每秒 1000-10000 条典型消息。在不限速的情况下循环发布消息可能会导致短时间内出现短暂的突发高带宽。为避免这种情况,您可以在 Google Cloud 内的机器上运行发布者,或降低发布消息的速率以匹配可用带宽。

  • 检查您的主机和 Google Cloud 之间是否存在因启动网络拥塞或防火墙等原因造成的超长延迟时间。计算网络吞吐量提供了在不同场景下查找带宽和延迟时间的指南。

  • 归根结底,一个机器能发布的数据量有限。您可能需要尝试横向扩展或在多台机器上运行发布商客户端的多个实例。测试 Cloud Pub/Sub 客户端以最大限度地提升流式传输性能展示了 Pub/Sub 如何通过增加 CPU 数量在单个 Google Cloud 虚拟机上进行扩展。例如,对于 1KB 大小的消息,16 核 Compute Engine 实例可以达到 500 MB/s 到 700 MB/s 的传输速率。

发布超时时长不足

如需降低发布调用的超时率,请确保您在发布商客户端的重试设置中定义了足够长的超时。对于重试设置,请将初始截止时间设置为 10 秒,将总超时时间设置为 600 秒。即使您没有积累大量积压的未发送消息,请求延迟时间偶尔出现高峰也会导致发布调用超时。但是,如果您的问题是由持续的瓶颈(而非偶尔的超时)造成的,则重试次数越多,错误就越多。

客户端库问题

您可能运行了某个具有已知问题的客户端库版本。以下列表包含所有客户端库的问题跟踪器。如果您发现影响您所用客户端库版本的已知问题,请升级到最新版本的客户端库。这样可确保您安装了所有相关更新,包括修复程序和性能改进。

架构问题

如果您的发布开始返回 INVALID_ARGUMENT,则可能是因为有人更新了主题以更改关联的架构删除了架构删除了与主题关联的架构修订版本。在这种情况下,请将主题的架构设置更新为与要发布的消息匹配的架构和一组修订版,或者调整消息格式以与当前架构匹配。

消息加密问题

如果您已将 Pub/Sub 主题配置为使用客户管理的加密密钥加密已发布的消息,则发布操作可能会失败并显示 FAILED_PRECONDITION 错误。如果 Cloud KMS 密钥已停用,或者无法再访问通过 Cloud EKM 管理的外部密钥,则可能会发生此错误。如需继续发布,请恢复对密钥的访问权限