【发布时间】: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创建频道?
【问题讨论】: