2017-02-18 28 views
3

我刚开始使用Azure ServiceBus。有一件事我不完全清楚,而且我很难找到答案。Azure ServiceBus:所有主题订户都必须处理消息

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

在我的具体使用情况下,我想通过对消息进行处理所有用户,而不仅仅是任意/一个用户。这完全可能与主题有关吗?

回答

3

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

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

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

5

您的问题已经得到解答,但似乎有混淆(订阅\订户),以及什么是建议的用例。

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

在主题\预订中,主题中的消息是已将复制到预订。所以每个订阅都独立于其他订阅。这就像队列的不同副本。

现在,您从客户端接收消息的客户端应用程序就是您称为订户的东西。每个客户(订户)都是为了连接到一个订阅。在这种情况下,订阅者不会竞争消息,并且每个订阅者可以像处理其他消息一样处理相同的消息。另一方面,如果你有很多连接到相同订阅的客户端应用程序(订阅者),那么它们自然会竞争相同的消息。

希望这解释了你得到的答案(这看起来有冲突,但实际上只是使用相同的术语)。底线是最终你可以用ServiceBus做两种情况。

相关问题