【问题标题】:Azure ServiceBus: all topic subscribers must process messageAzure ServiceBus:所有主题订阅者必须处理消息
【发布时间】:2017-07-08 02:33:25
【问题描述】:

我刚刚开始使用 Azure ServiceBus。有一件事我并不完全清楚,我很难找到答案。

如果我在订阅消息上调用message.Complete(),这是否意味着该消息将不再发送给任何其他订阅者,或者我只是为当前订阅者完成此消息?换句话说,服务总线是否跟踪每个订阅者或每个订阅的消息?

在我的特定用例中,我希望消息由 所有 订阅者处理,而不仅仅是 any/one 订阅者。主题完全有可能吗?

【问题讨论】:

    标签: .net azure azureservicebus azure-servicebus-topics


    【解决方案1】:

    您的问题已得到解答,但在术语(订阅\订阅者)以及推荐的用例方面似乎存在混淆。

    考虑一个简单的队列,其中一端放置消息,另一端弹出消息。这就是 ServiceBus 队列的行为方式。
    现在考虑一个队列,您仍然将消息放在一端,但随后它分成多个端,您可以从中弹出消息。这描述了一个主题(您放置消息的位置)和一个订阅(您弹出消息的位置)。

    在主题\订阅中,主题中的消息被复制到订阅。所以每个订阅都独立于另一个订阅。这就像队列的不同副本。

    现在,您从订阅接收消息的客户端应用程序就是您所说的订阅者。每个客户端(订阅者)都旨在连接到单个订阅。在这种情况下,订阅者不会竞争消息,每个订阅者都可以像其他订阅者一样处理相同的消息。

    另一方面,如果您有许多客户端应用程序(订阅者)连接到同一个订阅,那么它们自然会竞争相同的消息。

    希望这解释了您得到的答案(这似乎是相互矛盾的,但实际上只是以不同的方式使用相同的术语)。底线是最终您可以使用 ServiceBus 完成这两种情况。

    【讨论】:

      【解决方案2】:

      消息旨在由单个竞争消费者处理。否则将被视为消息重复。

      如果您需要向同一个逻辑订阅者的多个实例发送相同的消息,则每个订阅者都必须拥有自己的专用订阅队列和默认过滤器。

      例如:使用云服务时,您需要为每个 CS 角色实例创建一个订阅者。每个订阅队列都需要是唯一可识别的,并且唯一标识符必须是确定性的。一种选择是使用 CS 实例 ID。每当流程向外扩展时,实例 ID 都会附加到订阅队列中。这种方法也存在挑战。当进程缩小时,可能还有剩余未处理的消息。

      【讨论】:

        【解决方案3】:

        所以,显然这是不可能的。同一订阅的订阅者竞争处理消息,并且不能都处理同一消息。为此需要单独订阅。

        这个问题或多或少与Azure Service Bus - subscribers can independently subscribe to a subscription and share the same message?重复

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-02
          • 1970-01-01
          • 2018-01-02
          • 1970-01-01
          • 2015-07-27
          • 1970-01-01
          • 2012-02-18
          • 2019-09-09
          相关资源
          最近更新 更多