【问题标题】:Does Google Pub/Sub queue or topic?Google Pub/Sub 是否有队列或主题?
【发布时间】:2020-04-08 17:56:19
【问题描述】:

我熟悉 JMS 和 Google Pub/Sub 新手。

在 JMS 中有 2 个选项:

  • 队列:只有一个消费者可以接受消息。
  • 主题:每个消费者都接受来自主题的每条消息

我相信 Google Pub/Sub 应该支持这样的东西,但是快速谷歌搜索并没有帮助我回答这个问题。

请指出相应的文档部分。

【问题讨论】:

    标签: jms google-cloud-pubsub messagebroker


    【解决方案1】:

    正如名称“Pub/Sub”所示,Google Pub/Sub 支持与 JMS 主题相对应的发布/订阅语义。它不支持对应于 JMS 队列的点对点语义,至少不直接支持。

    您可以在the documentation 中查看语义概览。 “发布者-订阅者关系”部分可能会有所帮助。需要明确的是,本文档确实在两个地方使用了 queue 这个词:

    1. 在“Pub/Sub 消息流”部分:“当订阅者确认消息时,它会从订阅的消息队列中删除。”
    2. 在“常见用例”部分:“例如,可以在多个工作人员(例如 Google Compute Engine 实例)之间高效地分配大量任务。”

    这里的术语 queue 用于指代主题上的实际订阅(即放置消息以供订阅者使用的位置)。此外,architectural overview 包括此图: 此图演示了多个订阅者如何从同一订阅接收消息(例如,用于平衡工作负载)。这类似于“共享订阅”功能added for topics in JMS 2

    【讨论】:

    • 我已经阅读了它,但它并没有直接回答我的问题。让我们甚至看看您链接的页面中的引用:平衡网络集群中的工作负载。例如,一个大型任务队列可以有效地分配给多个工作人员,例如 Google Compute Engine 实例。 我希望这里应该是队列,因为在主题的情况下,每个工作人员都会收到每条消息,这将导致所有工人都在做同样的工作,通常是出乎意料的
    • 是的,我也找到了这张照片。它回答了我的问题
    • 订阅者->订阅是队列,主题->订阅是发布/订阅
    【解决方案2】:

    我一直在寻找这个问题的答案,我发现这个文档描述了队列的行为而不是主题:

    https://cloud.google.com/pubsub/docs/subscriber

    但是,当订阅者未收到消息时,Pub/Sub 会尝试 不要将其交付给同一订阅中的任何其他订阅者。

    所以我的理解是,如果你愿意

    • 主题行为(一对多):您创建多个订阅与一个订阅者,每个订阅者都会收到一条消息

    • 一种具有跨订阅者负载平衡的队列行为:您创建一个包含多个订阅者的订阅。

    我没有看到订阅的订阅者之间的分布情况。很可能是循环赛。

    【讨论】: