2016-11-26 279 views
0

我知道AMQP并尝试为RabbitMQ系统制定通知体系结构。RabbitMQ - 主题交换 - 同一主题的两个或更多的消费者

我想要一个Topic交换(NotificationsExchange,我们假设),具体是因为我想灵活使用主题交换附带的路由键和队列,以及更多关于该主题未来扩展的选项。我可能是错误的,因为...

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

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

是否有可能让两个消费者从同一队列中得到通知(始终如一)?

例如:

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

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

是否有可能有一个主题交流,其中两个消费者可以从一致同一个队列(例如,相同的路由键)读取相同的消息,或者我必须去与扇出交易所呢?

谢谢。

回答

2

是否有可能让两个消费者从同一队列中得到通知(始终如一)?

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

当您在一个队列上有多个使用者时,使用者是循环负载均衡。如果消费者1接收消息,消费者2不能接收

相反,你想要做的是增加额外的路径处理程序为每一个消费者,并让每个消费者创造它自己的队列。

例如NotificationEx可能具有对Notif.#的绑定,其推动到dbQueue。同一个交易所将有一个Notif.#的绑定,它将消息推送到mvcQueue

您的数据库使用者将从dbQueue消耗,并且您的Web应用程序将从mvcQueue消耗。

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


FWIW,对于任何给定的情况都没有“正确”或“错误”的交换类型。您可以为任何情况进行任何交换类型的工作。但是,某些交换类型可以更容易地处理某些情况。

你可能想看看我的RabbitMQ的电子书供关于更换类型,其通常被接受的“最佳使用情况”的详细信息,以及它们如何能够在相当有趣的场景应用:https://leanpub.com/b/rmq-layout-and-patterns

+0

谢谢 - 我hadn”如果我可以根据相同的“推送标准”创建两个完全分开的队列(因为缺乏正确的术语 - 我将不得不更仔细地查看这些细节)。作为一个便笺,我今天早上开始深入研究RabbitMQ和AMQP,这是我在SO上看到的关于这个主题的第四篇文章(也可能有一两篇博文)我购买了一个几小时前的电子书。很有帮助。 – jleach

+0

顺便说一下,如果偶然可以举一个快速的例子来说明如何创建这些单独的队列,那就太棒了。如果没有,我会最终找到它,但我认为我还没有发现它,并且RabbitMQ的内容似乎没有涵盖这种情况。再次感谢 – jleach

+0

很高兴我的工作很有帮助! :)对于多个队列,它与创建单个队列并将其绑定到交换机的方式相同。但是您需要做两件事:1)确保每个应用程序实例只有1个RMQ连接,并且2)为每个使用者使用一个新的通道。 1连接,该连接中有许多通道。连接是昂贵且有限的。频道很便宜,几乎没有限制。所有真实的工作都是在频道上完成的,最简单的方法是有1个频道专用于1个事物。希望有所帮助! –

相关问题