Google Pub/Sub 每约 5 条消息仅向一个订阅发送

Posted

技术标签:

【中文标题】Google Pub/Sub 每约 5 条消息仅向一个订阅发送【英文标题】:Google Pub/Sub sending to only one subscription every ~5 messages 【发布时间】:2020-03-03 05:19:05 【问题描述】:

我已经让 3 个客户端连接到一个订阅,以及一个发布者。在图像 2 中,订阅位于终端上,并且没有看到一个订阅,因为它托管在 DigitalOcean Droplet 上。似乎每 5 条消息,它切换哪个订阅者实际接收消息,这不应该发生。我也改变了速度,总是大约 5 条消息。

这是所有客户端用于订阅的代码:

sub.on("message", (msg) => 
  console.log(`Message:1 $msg.data.toString("utf-8")`)
  msg.ack()
)

这里是发布的代码:

console.log("send")
topic.publish(Buffer.from("hey"), 
        channelId: "641273551806267403"
    )

【问题讨论】:

我最初的想法是设计意图是每个订阅一个客户端......这似乎与其他平台非常不同 我的上述想法似乎是解决方案......我会等待另一个人在我回答之前插话 设计取决于。如果您希望多个服务响应一个消息队列,请使用一个订阅。如果您希望一条消息由多个服务处理(例如,一个服务在 BigQuery 中记录消息,另一个服务处理该消息),请使用多个订阅。在第一种情况下,每个服务将处理一定比例的消息,在第二种情况下,每个服务将处理所有消息。 @JohnHanley 这实际上有点酷,因为您可以使用第一种情况进行负载平衡...谢谢! 【参考方案1】:

在 Cloud Pub/Sub 中,订阅是一个逻辑实体,它希望将所有消息发布到与订阅相关联的主题。订阅者是代表订阅接收消息的客户端。当有多个订阅者接收单个订阅的消息时,每个订阅者都会收到消息的子集。这是负载平衡的情况,其中一个使用多个订阅者来大规模处理消息;如果需要支持更多消息,只需启动更多订阅者以接收来自同一订阅的消息。

当一个主题有多个订阅时,每条消息都必须发送给代表每个订阅接收消息的订阅者。这是扇出用例。

这是一个试图使其更清晰的图形。左边是负载均衡,右边是扇出:

【讨论】:

在Java Consumer客户端中,我们可以控制消费者线程的数量。那么在上图中,每个线程都是一个单独的“订阅者”吗?参考:github.com/googleapis/google-cloud-java/issues/1827

以上是关于Google Pub/Sub 每约 5 条消息仅向一个订阅发送的主要内容,如果未能解决你的问题,请参考以下文章

Google Pub/Sub 消息大约需要 5 分钟才能发布。这是为啥?

如何在 google Pub/Sub 中快速发布多条消息?

Google Cloud Pub/Sub Python SDK 一次检索单个消息

如何使用 Python 从 Google Pub/Sub 可靠地提取消息?

Google Cloud Pub/Sub 重试次数

Google Cloud 上使用 Pub/Sub 的主/从模式