Rest API 和 Google PubSub 之间更快的通信方法

Faster communication method between Rest API and Google PubSub

我最近开始研究 Google PubSub,并将其与推送订阅一起使用以在云 运行 实例之间传输数据。

在测试过程中,我注意到在少数情况下发布和订阅之间存在延迟。所以我直接使用 REST API 调用而不是通过 PubSub 发送它。

请帮助我理解以下 2 项:

  1. 哪个更快?
  2. 哪个效率高?

谢谢,
KK

直接在您的 Cloud 运行 实例之间进行通信与通过 Cloud Pub/Sub 进行通信可能比哪个更快更有意义。在“良好”情况下,您的发布者和订阅者都正常运行并且 运行 并且没有超载,直接通信可能会更快。

使用 Pub/Sub 的原因有两个要点:可发现性和可靠性。对于可发现性,是否保证您的发布 Cloud 运行 实例将始终知道订阅 Cloud 运行 实例的 URL?数据传输总是一对一的吗?您是否可以拥有多个想要接收消息的 Cloud 运行 实例?如果是这样,您希望如何更新发布者以向两者发送消息?如果您直接通信,您可能必须向每个目标 Cloud 运行 实例发出单独的请求并等待两者的响应。如果您使用 Cloud Pub/Sub,这会为您处理:您的发布 Cloud 运行 实例只需向 Cloud Pub/Sub 和任何感兴趣的 Cloud 运行 实例发送一次消息将注册为订阅并接收所有消息。

使用 Pub/Sub 的另一个主要原因是可靠性。如果订阅 Cloud 运行 实例停机或过载,您的发布 Cloud 运行 实例会做什么?它会缓冲消息吗?将它们写入持久存储?它如何管理缓冲区或存储并最终重新传递消息?如果 Cloud 运行 实例在此期间重启怎么办?使用 Cloud Pub/Sub,您通常无需担心任何这些注意事项,因为该服务旨在提供高可用性并在需要时快速缓冲消息,而不会影响发布者的性能。

因此,如果速度是您唯一关心的问题,并且您从一个云 运行 实例到另一个实例的请求总是一对一的,您将始终知道目标云的地址 运行 实例,并且您无需实施更复杂的缓冲(基本上,保证最多一次交付)就可以了,那么直接调用可能就可以了。

但如果需要考虑这些因素中的任何一个,那么云 Pub/Sub 将是更好的选择。由于它要跳过多个步骤,因此它可能会变慢。您可能可以做一些事情来确保延迟最小化。两个常见的是:

  1. 确保您只实例化发布者客户端一次并重用它,而不是为每次发布都重新创建客户端。
  2. 在您的 publisher batch settings 中,将 maxMessages 设置为 1,以便通过调用 publish 收到每条消息后立即发送。如果您的消息吞吐量相对较低,这将很有帮助。如果您的吞吐量很高,那么关键是要确保您不等待同步发布的结果,尤其是当您在循环中发布消息时。通过异步等待,您将能够将更多消息集中在一起,从而更有效地发送它们。

所以对于高效的问题,没有单一的答案。这在很大程度上取决于用例和所需的行为。但很有可能,从工作量的效率角度来看,您必须完成可靠的交付,Pub/Sub 是更好的选择。