多个消费者如何在RabbitMQ中订阅相同的主题并获得相同的消息

时间:2017-02-17 05:06:52

标签: javascript node.js rabbitmq

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

我来自JS / Node背景,其中事件发布/子模式的工作方式如下:当许多消费者使用发布/订阅模式订阅相同的主题时,只要某个生产者发布它,所有这些消息都会得到相同的消息。

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

例如:

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

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

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

制作人1发布到主题'request.user.add'

制作人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
      });
    });
  });
});

2 个答案:

答案 0 :(得分:0)

  

我期望实施的内容   他们中的三个得到了两个消息。

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

当您要发布时,您正在使用(例如)'request.user.add'发布主题交换(让它称之为E1),并使用将所有队列绑定到E1匹配路由键(因为我们在这里讨论主题)将得到消息。

或者也许这样说:一个消息从一个队列中消耗一次,从一个交换消耗的消息数与绑定到它的队列一样多(使用适当的路由密钥)。

在@hirikarate之后加入解决方案

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

答案 1 :(得分:0)

使用fanout方法可以做到这一点。您可以将RabbitMQ用作广播机制。

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

下找到它。
相关问题