6

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

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

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

4

3 回答 3

11

您的问题已经得到解答,但术语(订阅\订阅者)似乎存在混淆,推荐的用例是什么。

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

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

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

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

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

于 2017-02-19T19:04:15.277 回答
5

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

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

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

于 2017-02-19T17:37:03.063 回答
1

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

这个问题或多或少是Azure 服务总线的重复——订阅者可以独立订阅订阅并共享相同的消息?

于 2017-02-18T20:00:02.437 回答