【问题标题】:Rabbitmq doesn't persistent a message in exchange if there is no subscriber?如果没有订阅者,Rabbitmq 不会持久化消息作为交换?
【发布时间】:2019-01-18 03:44:33
【问题描述】:

我有以下发布者和订阅者:

// publisher.js

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

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';
    var msg = process.argv.slice(2).join(' ') || 'Hello World!';

    ch.assertExchange(ex, 'fanout', {durable: true});
    ch.publish(ex, '', new Buffer(msg));
    console.log(" [x] Sent %s", msg);
  });

  setTimeout(function() { conn.close(); process.exit(0) }, 500);
});
//subscriber.js

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

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var ex = 'logs';

    ch.assertExchange(ex, 'fanout', {durable: true});

    ch.assertQueue('', {exclusive: true}, function(err, q) {
      console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q.queue);
      ch.bindQueue(q.queue, ex, '');

      ch.consume(q.queue, function(msg) {
        if(msg.content) {
          console.log(" [x] %s", msg.content.toString());
        }
      }, {noAck: true});
    });
  });
});

如果我运行 publisher.js 发布两条消息,然后运行subscriber.js,我希望订阅者打印我过去发布的两条消息,但实际上订阅者没有收到任何消息。

如何让 RabbitMQ 持久化已发布的消息,允许任何订阅者从头开始消费或上次消费的任何地方?

【问题讨论】:

  • 您的意思是在您的订阅者代码中发布吗?
  • 抱歉,我意识到我粘贴了错误的订阅者代码。现在我刚刚更新了。

标签: rabbitmq publish-subscribe


【解决方案1】:

如果 RabbitMQ 无法将消息路由到队列,则该消息将被丢弃。

由于您在订阅者代码之前运行发布者代码,因此没有队列绑定到您的交换,因此无处可路由消息。

您需要在发布者之前运行您的订阅者代码,或者您必须让您的发布者或其他进程创建一个命名队列并将其绑定到您的交换。然后,您的订阅者将使用该队列。


注意:RabbitMQ 团队会监控 rabbitmq-users mailing list,并且仅有时会回答 StackOverflow 上的问题。

【讨论】:

  • 谢谢@LukeBakken。对于您的第一个建议:我不能在我的发布者之前运行我的订阅者,因为我想确保即使我的所有订阅者都已关闭,我的发布者仍然可以发布不会被丢弃的消息。对于您的第二个建议,队列也可以配置为“扇出”吗?我认为只有交换可以配置为“扇出”。如果一个队列不能是“扇出”,那么我不能有多个订阅者订阅相同的消息,如 pubsub。
  • 必须做一些事情来创建队列并将其绑定到扇出交换 - 要么您必须手动执行,要么您的发布者执行此操作,或者您的订阅者执行此操作,或者三者都执行。多次声明同一个队列并没有什么坏处。请注意,您也不能在这种情况下使用独占队列,因为您和您的发布者代码都不能创建它们。如果必须在消费者之前存在,则必须使用众所周知的命名队列。
猜你喜欢
  • 2017-11-08
  • 1970-01-01
  • 2016-03-22
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多