Azure ServiceBus:所有主题订阅者都必须处理消息

Azure ServiceBus: all topic subscribers must process message

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

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

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

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

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

的重复

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

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

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

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

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

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

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

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

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