RabbitMQ - 主题交换 - 同一主题两个或更多消费者

时间:2016-11-26 00:10:20

标签: rabbitmq

我对AMQP很感兴趣,并尝试为RabbitMQ系统制定通知架构。

我想要一个主题交换(NotificationsExchange,让我们说),特别是因为我希望灵活使用主题交换附带的路由键和队列,以及更多选项,以便将来扩展该主题。我可能错了,因为......

我还想让两个或更多消费者使用每个通知。作为基线,我希望每个发布的通知都在数据库中结束。此外,我希望每个通知都有资格被客户端应用程序使用(例如,Web应用程序使用并进一步推送套接字以便在没有数据库轮询的情况下立即进行用户通知)。

这真的听起来像是一个扇出的情况,除了我不想那样做,因为我需要更多的队列来处理各种通知(我想 - 对AMQP来说仍然是新手,并试图包裹我的头脑围绕它)。

是否可以让两个消费者从同一个队列得到通知(一致)?

例如:

  • Notif.NotifGroup.User.ThisUser推送到NotificationExchange
  • dbListener绑定到Notif.#
  • mvcClientListener也绑定到Notif.#(并进一步确定用户是否在线并通过套接字向下游推送)

我不确定我是否在正确的轨道上。我正在读到“同一队列中的多个消费者以循环方式进行负载均衡”,坦率地说,我不知道这意味着什么。

是否可以建立一个主题交换,其中两个消费者可以始终从同一队列中读取相同的消息(例如,相同的路由密钥),或者我是否必须使用扇出交换?

感谢。

1 个答案:

答案 0 :(得分:5)

  

是否可以让两个消费者从同一个队列得到通知(一致)?

是的,但这不是你想要的。

当一个队列中有多个消费者时,消费者的循环负载均衡。如果消费者1收到消息a,则消费者2无法接收消息

相反,您要做的是为每个消费者添加额外的路由处理程序,并让每个消费者创建它自己的队列。

例如NotificationEx可能具有Notif.#的绑定,该绑定会推送到dbQueue。相同的交换将具有Notif.#的绑定,将消息推送到mvcQueue

您的数据库使用者将从dbQueue消费,您的网络应用将从mvcQueue消费。

这使得添加新的消费者非常容易,每个消费者都有自己的队列和绑定到交换。

FWIW,没有"对"或"错误"任何给定情况的交换类型。您可以使任何交换类型适用于任何情况。但是,某些交换类型可以更容易地处理某些情况。

您可能想查看我在RabbitMQ上的电子书,了解有关交换类型,其普遍接受的"最佳用例"以及如何在相当有趣的场景中应用它们的更多信息:https://leanpub.com/b/rmq-layout-and-patterns

相关问题