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

sme*_*its 3 rabbitmq node.js

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

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

关于消息持久化的注意事项

将消息标记为持久并不能完全保证消息不会丢失。尽管它告诉 RabbitMQ 将消息保存到磁盘,但 RabbitMQ 已接受消息但尚未保存的时间窗口仍然很短。此外,RabbitMQ 不会对每条消息执行 fsync(2) —— 它可能只是保存到缓存中,而不是真正写入磁盘。持久性保证并不强,但对于我们简单的任务队列来说已经足够了。如果您需要更强的保证,那么您可以使用 publisher recognizes

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

我无法理解如何使用 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');
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

但我不确定这就是我所需要的。另外,在消费者方面我应该做什么?createConfirmChannel以同样的方式连接,使用?再次创建通道。

Luk*_*ken 5

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