【问题标题】:RabbitMQ - Topic Exchange - Same topics two or more consumersRabbitMQ - 主题交换 - 两个或多个消费者的相同主题
【发布时间】:2017-04-10 08:51:48
【问题描述】:

我是 AMQP 的新手,正在尝试为 RabbitMQ 系统制定通知架构。

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

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

这听起来确实像是一个扇出交换的情况,但我不想这样做,因为我需要更多的队列来处理各种通知(我认为 - 对 AMQP 来说还是新手,并试图解决我的问题周围)。

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

例如:

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

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

是否有可能有一个主题交换,其中两个消费者可以一致地从同一个队列中读取相同的消息(例如,相同的路由键),或者我必须为此使用扇出交换?

谢谢。

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

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

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

    当您在一个队列上有多个消费者时,消费者是循环负载平衡的。如果消费者1收到消息a,消费者2就收不到了

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

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

    您的数据库使用者将从dbQueue 使用,而您的网络应用程序将从mvcQueue 使用。

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


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

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

    【讨论】:

    • 谢谢 - 我不知道是否可以基于相同的“推送标准”创建两个完全独立的队列(因为缺少正确的术语 - 我将不得不稍微看看这些细节接近一点了)。附带说明一下,我今天早上才开始深入研究 RabbitMQ 和一般的 AMQP,这是我在 SO 上看到的关于该主题的第四篇文章(也许还有一两篇博客文章?)我买了一个几个小时前的电子书。很有帮助。
    • 顺便说一句,如果有机会可以举一个简单的例子来说明如何创建这些单独的队列,那就太好了。如果不是,我最终会找到它,但我认为我还没有遇到它,而且 RabbitMQ 的 tuts 似乎没有涵盖这种情况。再次感谢
    • 很高兴我的工作对您有所帮助! :) 对于多个队列,它的工作方式与创建单个队列并将其绑定到交换器相同。但是,您需要做 2 件事:1) 确保每个应用程序实例只有 1 个 RMQ 连接,以及 2) 为每个使用者使用一个新通道。 1 个连接,该连接中有许多通道。连接昂贵且有限。频道很便宜,而且几乎没有限制。所有真正的工作都是在频道上完成的,最容易让 1 个频道专门用于 1 件事。希望有帮助!
    • @DerickBailey 请帮我解决这个问题 - stackoverflow.com/questions/59213798/…
    猜你喜欢
    • 2017-01-24
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2018-12-31
    • 2019-01-10
    相关资源
    最近更新 更多