【问题标题】:How can multiple consumers subscribe to same topic and get same message in RabbitMQ多个消费者如何订阅同一个主题并在 RabbitMQ 中获取相同的消息
【发布时间】:2017-02-17 05:06:51
【问题描述】:

首先,我知道已经有一个类似问题here的答案,但我仍然不确定这是因为RabbitMQ的不可能还是因为我没有足够的研究。

我来自 JS/Node 背景,事件 pub/sub 模式的工作原理是这样的:当许多消费者使用 pub/sub 模式订阅同一个主题时,每当某个生产者发布消息时,他们都应该得到相同的消息。

我希望通过消息代理实现相同的模式。


例如:

消费者1收听'request.user.#'

消费者2收听'request.user.#'

消费者3收听'request.#.#'

生产者 1 发布到主题 'request.user.add'

Producer 2 发布到主题'request.user.detail'


RabbitMQ 实际做了什么(根据RabbitMQ example about Topics

Consumer 3 获取两条消息,而Consumer 1Consumer 2 获取第一条消息,并且只有它们中的任何一个获取第二条消息。


我期望实现的内容

其中三个同时收到消息。


您是否有任何想法通过消息代理(RabbitMQ 处于最高优先级)来实现这一点?请指出我是否遗漏了什么或在我的问题中不清楚的地方。

提前致谢。


使用解决方案编辑:

感谢@cantSleepNow,这是我在他的提示后想出的Consumer 1Consumer 2 的代码(NodeJS):

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', (err, conn) => {
  conn.createChannel((err, ch) => {
    var ex = 'topic_exchange'; // Exchange name    
    ch.assertExchange(ex, 'topic'); // Exchange with 'topic' type    
    ch.assertQueue('', {exclusive: true}, (err, q) => {
      ch.bindQueue(q.queue, ex, 'request.user.#'); // Topic pattern
      ch.consume(q.queue, (msg) => {
        // Process message
      });
    });
  });
});

【问题讨论】:

  • RabbitMQ 是您“解决方案”的必要组成部分吗?因为这是 Mosquitto 的面包和黄油
  • @JaromandaX 我愿意接受所有建议并试一试,我只是对 RabbitMQ 更感兴趣。

标签: javascript node.js rabbitmq


【解决方案1】:

我期望实现的
其中三个收到了两条消息。

简单地使用主题交换,让每个消费者用适当的路由键声明它自己的队列。

当您发布时,您将发布到一个主题交换器(我们称之为 E1)(例如)'request.user.add' 以及所有使用 匹配 路由键绑定到 E1 的队列(因为我们在这里讨论主题)会收到消息。

或者可以这样说:一条消息从一个队列被消费一次,从一个交换中消费的次数与绑定到它的队列一样多(使用适当的路由键)。

@hirikarate 添加问题解决方案后编辑

好吧,我不使用javascript,但我会尽力提供帮助:) exclusive 你是说只有一个消费者可以连接到队列,这没关系。此外,如果您在每个消费者中创建一个具有唯一名称的队列,您将获得几乎相同的效果(显然不同之处在于其他消费者将被允许从中消费)同样,在 JS 中不知道,但应该有一个使用给定名称创建队列或让服务器将名称返回给您的方式。其他看起来没问题,你只需要测试它。

【讨论】:

  • 我用我想出的解决方案编辑了我的问题,请查看并给我反馈。
  • @hirikarate 好的,我在答案中添加了一些内容,因为评论太长了。
  • 使用空字符串作为第一个参数调用 assertQueue 将告诉 RabbitMQ 创建一个队列并为其选择一个唯一的名称。根据此链接rabbitmq.com/tutorials/tutorial-three-javascript.html(临时队列)。我没有让两个消费者绑定到同一个队列,因为只有一个消费者从队列中获取消息。顺便说一句,我明白了你的想法,并将其标记为最终答案。我会做更多的测试。
【解决方案2】:

这可以使用fanout 方法实现。您可以使用 RabbitMQ 作为广播机制。

这将有一个发件人和多个订阅者,链接是here,您可以在教程三:发布/订阅部分下找到它

【讨论】:

    最近更新 更多