如何设置“发布者确认”?

时间:2018-06-20 13:08:20

标签: node.js rabbitmq

我的应用程序不能丢失任何消息。 RabbitMQ做得很好,但并非总是完美无瑕。

仅将消息标记为持久性是不够的。时间窗口很小,可以将消息写入缓存,但不能写入磁盘。 如果此处发生了某些情况,例如崩溃(非常不可能),则未写入磁盘的消息会丢失。这是文档(link here)中的注释

  

有关消息持久性的说明

     

将邮件标记为持久邮件不会   完全保证邮件不会丢失。虽然它告诉   RabbitMQ将消息保存到磁盘,还有很短的时间   RabbitMQ接受消息但尚未保存时的窗口。   另外,RabbitMQ不会对每条消息都执行fsync(2)-可能只是   保存到缓存中,而不真正写入磁盘。持久性   保证不强,但是对于我们的简单保证来说绰绰有余   任务队列。如果您需要更强有力的保证,则可以使用   publisher confirms

发布者确认这是确保消息不会丢失的必要机制。

我无法理解如何使用Node.js,尤其是使用amqplib软件包(github code)来启用它。 在库中挖掘一点,我发现了这一点:

var open = require('amqplib').connect();
open.then(function(c) {
  c.createConfirmChannel().then(function(ch) {
    ch.sendToQueue('foo', new Buffer('foobar'), {},
      function(err, ok) {
        if (err !== null)
          console.warn('Message nacked!');
        else
          console.log('Message acked');
    });
  });
});

但是我不确定这就是我所需要的。另外,在消费者方面我该怎么办?以同样的方式连接,使用createConfirmChannel重新创建频道吗?

2 个答案:

答案 0 :(得分:1)

RabbitMQ团队监视the rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。


您的代码正确,createConfirmChannel创建一个启用了发布者确认的频道。您还应该签出this example code

答案 1 :(得分:0)

几乎不能,每当消息丢失时,您就可以捕获我认为的异常。这些是使用JS提供的try / catch结构处理的。