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

Azure服务总线、AWS SNS、RabbitMQ->;所有订阅者都收到消息了吗?,rabbitmq,azureservicebus,amazon-sns,Rabbitmq,Azureservicebus,Amazon Sns,在查看Pub/Sub模式时,我遇到了砍伐场景: 假设您有一个水平缩放的应用程序,它有X个实例。他们都订阅了一个主题,在这个主题中,会有类似“从帐户a向帐户B转账10美元”的消息。当有人向该主题发布消息时,所有订户都会收到该消息吗 显然,在上述情况下,消息应该只由一个订户接收,并且只处理一次 如何处理这种情况?你会放弃酒吧/酒吧而开始合租吗?在你完全理解之前,让我用例子来解释一些事情。我曾在Azure服务总线上工作过,因此我将在该上下文中进行解释 在发布/订阅中,您有一个主题,可能有多个订阅。假设

在查看Pub/Sub模式时,我遇到了砍伐场景:

假设您有一个水平缩放的应用程序,它有X个实例。他们都订阅了一个主题,在这个主题中,会有类似“从帐户a向帐户B转账10美元”的消息。当有人向该主题发布消息时,所有订户都会收到该消息吗

显然,在上述情况下,消息应该只由一个订户接收,并且只处理一次


如何处理这种情况?你会放弃酒吧/酒吧而开始合租吗?

在你完全理解之前,让我用例子来解释一些事情。我曾在Azure服务总线上工作过,因此我将在该上下文中进行解释

在发布/订阅中,您有一个主题,可能有多个订阅。假设我们有一个主题“购物主题”。我们有两个订阅名为“付款订阅”、“购物车订阅”。现在,我们发布主题为“付款已处理”的消息。选择该消息是订阅的自由裁量权,原因是订阅必须提及它想要选择的消息

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


现在我们讨论个人订阅。假设我们在“付款订阅”中添加了消息。此订阅有2个实例/进程,可以处理消息“Payment processed”。拾取消息的第一个进程将处理该消息并将其从订阅中删除

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

因此,在您的情况下,您应该设计一个队列,其中包含

“将10美元从帐户A转到帐户B”

被路由到并且所有使用者都在该队列本身上注册,这确保一条消息将只发送给一个订阅者

另一点与您的问题无关,但需要知道的是,还有另一个概念称为“消费者优先级”,它允许您确保高优先级消费者在活动时接收消息,而当高优先级消费者阻塞时,消息只会发送给低优先级消费者


有关“拾取消息的第一个进程将处理该消息并将其从订阅中删除”的更多信息,请参见

:消息只能由一个或至少一个订阅者拾取?这是一种默认行为或队列,如果进程拾取消息,它将在称为可见性超时的一段时间内从队列中不可见(可配置设置)因此其他进程无法拾取消息。如果进程在给定时间内未能处理消息,则拾取消息的进程需要在该时间内处理消息,否则消息将重新出现在队列中。如果多个进程正在侦听订阅,则一次只能有一个进程从订阅中拾取消息。在sho中rt消息将仅由消费者拾取,因此其他消费者无法处理它。