我最近开始在Google PubSub上工作,并使用相同的Push订阅在云运行实例之间传输数据。
在测试期间,我注意到在少数情况下发布和订阅之间存在延迟。所以我直接使用REST API调用,而不是通过PubSub发送。
请帮助我理解以下两项:
- 哪个更快?
- 哪个是有效的?
谢谢你,
KK
直接在您的Cloud Run实例之间进行通信与通过Cloud Pub/Sub进行通信可能比哪个更快有更多的含义。在"好"的时候;在这种情况下,你的发布者和订阅者都在运行,没有过载,直接沟通可能会更快。
使用Pub/Sub的原因主要有两点:可发现性和可靠性。对于可发现性,是否保证发布Cloud Run实例总是知道订阅Cloud Run实例的URL ?数据的传输总是从一个到另一个吗?您是否曾经拥有多个想要接收消息的Cloud Run实例?如果是这样,您希望如何更新发布者以向两者发送消息?如果直接通信,则可能必须向每个目标Cloud Run实例发出单独的请求,并等待两者的响应。如果你使用云发布/订阅,这是为你照顾:你的发布云运行实例只需要发送消息一次到云发布/订阅和任何感兴趣的云运行实例将被注册为订阅和接收所有的消息。
使用Pub/Sub的另一个主要原因是可靠性。如果订阅Cloud Run实例宕机或过载,发布Cloud Run实例怎么办?它会缓冲消息吗?将它们写入持久存储?它如何管理缓冲区或存储并最终重新传递消息?如果Cloud Run实例在此期间重新启动怎么办?使用Cloud Pub/Sub,您通常不需要担心这些问题,因为该服务被设计为高可用性,并在需要时快速缓冲消息,而不会影响发布者的性能。
因此,如果速度是你唯一关心的,并且你从一个Cloud Run实例到另一个Cloud Run实例的请求总是一对一的,你将总是知道目标Cloud Run实例的地址,并且你可以不实现更复杂的缓冲(基本上,保证最多一次交付),那么直接调用可能会是好的。
但是如果需要考虑这些因素,那么云发布/订阅将是一个更好的选择。它可能会更慢,因为它会跳过多个步骤。您可以做一些事情来确保延迟最小化。两个常见的是:
- 确保您只实例化一次发布者客户端并重用它,而不是为每次发布重新创建客户端。
- 在您的发布者批处理设置中,将maxMessages设置为1,以便每条消息通过对
publish
的调用收到后立即发送。如果您的消息吞吐量相对较低,这将很有帮助。如果您的吞吐量很高,那么关键是要确保不要同步等待发布的结果,特别是在循环中发布消息时。通过异步等待,您可以将更多消息批处理在一起,从而更有效地发送它们。
所以对于效率的问题,没有唯一的答案。这在很大程度上取决于用例和期望的行为。但是,从效率的角度来看,为了获得可靠的交付,你必须做的工作数量,Pub/Sub是更好的选择。