RabbitMQ-主题交换-两个或更多消费者使用相同主题

jle*_*ach 3 rabbitmq

我很想知道AMQP,并试图为RabbitMQ系统设计一个通知体系结构。

我想要一个主题交换(例如,NotificationsExchange),这是因为我想灵活地处理主题交换附带的路由键和队列,以及将来扩展该主题的更多选项。不过我可能错了,因为...

我还希望每个通知都由两个或多个消费者使用。作为基准,我希望发布的每个通知都在数据库中结束。另外,我希望每个通知都适合客户端应用程序使用(例如,Web应用程序使用并进一步推送套接字以立即进行用户通知,而无需数据库轮询)。

这听起来确实像是扇出局,除非我不想这样做,因为我需要更多的队列来处理各种通知(我认为-对AMQP来说还很陌生,并且想尽办法解决) 。

是否可以从同一队列中(一致地)使两个使用者得到通知?

例如:

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

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

是否可以有一个主题交换,其中两个使用者可以从同一队列中连续读取相同的消息(例如,相同的路由密钥),或者我必须为此使用Fanout交换吗?

谢谢。

Der*_*ley 6

是否可以从同一队列中(一致地)使两个使用者得到通知?

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

当您在一个队列上有多个使用者时,这些使用者是循环负载平衡的。如果消费者1收到消息a,则消费者2无法收到它

相反,您要做的是为每个使用者添加其他路由处理程序,并让每个使用者创建自己的队列。

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

您的数据库使用者将从中使用,dbQueue而您的Web应用程序将从中使用mvcQueue

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


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

您可能想查看一下我在RabbitMQ上的电子书,以获取有关交换类型,它们通常被接受的“最佳用例”以及如何在相当有趣的场景中应用它们的更多信息:https : //leanpub.com/b/rmq-layout和模式

  • 很高兴我的工作有帮助!:) 对于多个队列,它的工作方式与创建单个队列并将其绑定到交换器相同。不过,您需要做两件事:1) 确保每个应用程序实例只有 1 个 RMQ 连接,2) 为每个消费者使用一个新的 Channel。1 个连接,该连接内有多个通道。连接价格昂贵且有限。渠道很便宜,而且几乎不受限制。所有实际工作都是在通道上完成的,最简单的方法是让 1 个通道专用于 1 件事。希望有帮助! (2认同)