Azure服务总线,AWS SNS,RabbitMQ->所有订阅者都收到消息?

时间:2019-09-25 17:47:50

标签: rabbitmq azureservicebus amazon-sns

在查看发布/订阅模式时,我遇到了相伴的场景:

  

假设您有一个水平缩放的应用程序,其中包含X个实例。他们所有人都订阅一个主题,在该主题中,诸如“将$ 10从帐户A转移到帐户B”之类的消息。当有人向该主题发布消息时,所有订阅者都会收到该消息吗?

在上述情况下,很明显,该消息应仅由1个订阅者接收,并且只能处理一次。

如何处理这种情况?您放弃发布/订阅并开始合并吗?

2 个答案:

答案 0 :(得分:0)

在完全理解之前,让我用示例解释一些事情。我从事过Azure服务总线的工作,因此我将在这种情况下进行解释。

在发布/订阅中,您只有一个主题,并且可能有多个订阅。假设我们有主题“购物主题”。我们有2个订阅,分别称为“付款订阅”,“购物车订阅”。现在,我们就该主题发布消息“付款处理”。订阅可以自行选择是否要选择该邮件,原因是订阅必须提及要选择的邮件。

在Azure服务总线中,我们有一个称为“规则”(消息标签)的东西。默认规则是订阅正在侦听所有消息,但是我们可以覆盖此行为,并说我只对特定消息感兴趣。在上述情况下,针对“付款订阅”添加了规则以侦听消息“付款处理”,因此该消息被添加到“付款订阅”订阅中以进行处理。即使“购物车订阅”也订阅了相同的主题,但它忽略了此消息,因此未将其添加到其订阅中。这样,任何预定的订阅都可以收听特定的消息,而不必全部收听。

现在,我们讨论个人订阅。假设我们已将消息添加到“付款订阅”。该订阅有2个实例/进程,准备处理消息“付款处理”。挑选消息的第一个过程将处理消息并将其从订阅中删除。

答案 1 :(得分:0)

在RabbitMQ中,通常,连接到同一队列的活动使用者将以循环方式从中接收消息。因此,这确保了消息仅被处理一次。

因此,在您的情况下,您应该设计一个队列,其中所有针对

的消息
  

“将$ 10从帐户A转移到帐户B”

被路由到并且所有使用者都将自己注册到此队列中,这确保了一条消息只会发给一个订户。

与您的问题无关但要知道的另一点是,还有一个名为“ 消费者优先级”的概念,它可以确保高优先级的消费者在活动时接收消息,仅当高优先级使用者阻止时,邮件才会发送给低优先级使用者。

可以找到更多信息here