【问题标题】:How to set up "publisher confirms"?如何设置“发布者确认”?
【发布时间】:2018-06-20 13:08:19
【问题描述】:

我的应用程序不能丢失任何消息。 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创建频道?

【问题讨论】:

    标签: node.js rabbitmq


    【解决方案1】:

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


    您的代码是正确的,createConfirmChannel 创建了一个启用发布者确认的频道。您也应该查看this example code

    【讨论】:

    • 非常感谢您的回答。消费者方面呢?我也需要在确认模式下创建频道吗?
    • 您需要以 RabbitMQ 期待确认的方式使用消息。这记录在 rabbitmq.com 以及 squaremo/amqp.node 示例中。
    【解决方案2】:

    你几乎不能,只要消息丢失,你就可以捕捉到我认为的异常。这些是使用 JS 提供的 try / catch 构造来处理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 2020-02-01
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多