我的应用程序不能丢失任何消息。 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
?
你几乎不能,每当消息丢失时,我认为你能够捕获异常。这些是使用 JS 提供的 try / catch 结构来处理的。