我的应用程序不能丢失任何消息。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以同样的方式连接,使用?再次创建通道。
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |