我刚刚开始使用Azure ServiceBus。有一件事我并不完全清楚,而且我很难找到答案。
如果我在订阅消息上呼叫message.Complete()
,这是否意味着此消息将不再发送给任何其他订阅者,或者我是否仅为当前订阅者填写此消息?换句话说,服务总线是否跟踪每个订户或每个订阅的消息?
在我的特定用例中,我希望消息由 所有 订阅者处理,而不仅仅是 any / one 订阅者。是否可以使用主题?
答案 0 :(得分:8)
您的问题已经得到解答,但似乎有一些混淆(订阅\订阅者),以及推荐的用例是什么。
考虑一个简单的队列,一端放置消息,另一端弹出消息。这就是ServiceBus队列的行为方式 现在考虑一个队列,你仍然把消息放在一端,但然后它分成多个末端,你可以从中弹出消息。这描述了一个主题(放置消息的位置)和订阅(弹出消息的位置)。
在主题\订阅中,主题中的邮件复制到订阅。因此,每个订阅都独立于其他订阅。它就像是队列的不同副本。
现在,从订阅接收消息的客户端应用程序就是您所谓的订阅者。每个客户端(订户)都旨在连接到单个订阅。在这种情况下,订阅者不会竞争消息,并且每个订阅者都可以处理与其他订阅者相同的消息。
另一方面,如果您有许多连接到同一订阅的客户端应用程序(订阅者),那么他们自然会竞争相同的消息。
希望这能解释你得到的答案(这似乎是相互矛盾的,但实际上只是以不同的方式使用相同的术语)。最后,您可以使用ServiceBus完成这两种方案。
答案 1 :(得分:4)
消息旨在由单个竞争消费者处理。否则,它将被视为重复消息。
如果您需要将同一消息发送到同一逻辑用户的多个实例,则每个用户必须拥有自己的专用订阅队列和默认过滤器。
例如:使用云服务时,您需要为每个CS角色实例创建一个订户。每个订阅队列需要是唯一可识别的,并且唯一标识符必须是确定性的。一种选择是使用CS实例ID。每当进程向外扩展时,实例ID都将附加到订阅队列。这种方法也是一个挑战。当进程扩展时,可能会有剩余的未处理消息。
答案 2 :(得分:1)
所以,显然这是不可能的。订阅 竞争 的订阅者处理邮件,并且不能全部处理相同的邮件。需要单独订阅。
重复