我的应用程序不能丢失任何消息。 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
重新创建频道吗?
答案 0 :(得分:1)
RabbitMQ团队监视the rabbitmq-users
mailing list,并且有时仅在StackOverflow上回答问题。
您的代码正确,createConfirmChannel
创建一个启用了发布者确认的频道。您还应该签出this example code。
答案 1 :(得分:0)
几乎不能,每当消息丢失时,您就可以捕获我认为的异常。这些是使用JS提供的try / catch结构处理的。