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

问题描述 投票:0回答:2

我的应用程序不能丢失任何消息。 RabbitMQ 做得相当不错,但它并不总是完美无缺的。

将消息标记为持久是不够的。有一个很小的时间窗口,消息可以写入缓存,但不能写入磁盘。 如果这里发生了一些事情,比如崩溃(非常不可能),未写入磁盘的消息就会丢失。这是文档中的注释(链接此处

消息持久化注意事项

将消息标记为持久不会 充分保证消息不会丢失。虽然它告诉 RabbitMQ将消息保存到磁盘,还有很短的时间 当 RabbitMQ 已接受消息但尚未保存它时的窗口。 另外,RabbitMQ 不会对每条消息执行 fsync(2) —— 它可能只是 保存到缓存并没有真正写入磁盘。坚持 保证并不强,但是对于我们的简单来说已经足够了 任务队列。如果您需要更强的保证,那么您可以使用 出版商确认

发布者确认是保证消息不丢失所需的机制。

我无法理解如何使用 Node.js 启用此功能,特别是使用

amqplib
包(github 代码)。 在图书馆里挖掘了一下我发现了这个:

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

node.js rabbitmq
2个回答
5
投票

您的代码是正确的,

createConfirmChannel
创建了一个启用了发布者确认的频道。您还应该查看此示例代码


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.