0

我检查了RabbitMQ 教程的“消息持久性”部分。但它有这个注释:

将消息标记为持久性并不能完全保证消息不会丢失。虽然它告诉 RabbitMQ 将消息保存到磁盘,但是当 RabbitMQ 接受消息并且还没有保存它时,仍然有很短的时间窗口。此外,RabbitMQ 不会对每条消息都执行 fsync(2) ——它可能只是保存到缓存中而不是真正写入磁盘

但是如果我需要真正持久的队列怎么办?我可以使用哪些最佳实践?例如,如果消息在 2 分钟内没有被确认,我是否应该在数据库中有“队列”并通过 cron 进行一些“重新发送”?有没有更好的解决方案?

另外,如果我的消费者在处理完消息之后发送 ACK 之前崩溃了怎么办?

UPD:我的问题被标记为聚类问题的“可能重复”。我不知道集群如何帮助解决这些问题。

4

2 回答 2

2

在此处阅读有关Tx 保证交付的信息

发布者会使用类似的东西:

ch.txSelect();
ch.basicPublish("", QUEUE_NAME,MessageProperties.PERSISTENT_BASIC,"nop".getBytes());
ch.txCommit();

注意:这可能会杀死您的性能应用程序!

编辑

另请阅读@old_sound 建议的“发布者确认” https://www.rabbitmq.com/confirms.html

于 2015-10-28T16:08:06.253 回答
0

查看为解决知道 RabbitMQ 是否已持久/复制您的消息的问题而做出的发布者确认:https ://www.rabbitmq.com/confirms.html

于 2015-11-21T13:11:53.150 回答