RabbitMQ中的真正持久队列

RabbitMQ中的真正持久队列,rabbitmq,amqp,durability,Rabbitmq,Amqp,Durability,我检查了“消息持久性”部分。但它有这样一句话: 将消息标记为持久性并不能完全保证消息 不会迷路的。尽管它告诉RabbitMQ将消息保存到磁盘, RabbitMQ接受一个 消息,但尚未保存。而且,RabbitMQ不执行fsync(2) 对于每一条消息,它可能只是保存到缓存中,而不是真的 写入磁盘 但是如果我真的需要持久队列怎么办?我可以使用哪些最佳实践? 例如,若消息在2分钟内并没有得到确认,我应该在数据库中设置“队列”并由cron进行一些“重新发送”吗?有更好的解决方案吗 另外,如果我的消费者在

我检查了“消息持久性”部分。但它有这样一句话:

将消息标记为持久性并不能完全保证消息 不会迷路的。尽管它告诉RabbitMQ将消息保存到磁盘, RabbitMQ接受一个 消息,但尚未保存。而且,RabbitMQ不执行fsync(2) 对于每一条消息,它可能只是保存到缓存中,而不是真的 写入磁盘

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

另外,如果我的消费者在处理消息之后和发送ACK之前崩溃了呢

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

请阅读有关Tx保证交付的信息

发布者将使用以下内容:

ch.txSelect();
ch.basicPublish("", QUEUE_NAME,MessageProperties.PERSISTENT_BASIC,"nop".getBytes());
ch.txCommit();
注意:这可能会杀死您的性能应用程序

编辑


另请阅读@old_sound建议的“Publisher confirmations”

看看Publisher confirmations,它是为了解决知道RabbitMQ是否持久/复制了您的消息的问题而设计的:

如果整个集群崩溃怎么办?概率非常低。。。然而,如果您真的很担心并且在应用程序级别不需要ACK,那么您可以拥有自己的队列来处理类似的情况。取决于应用程序-可能是通过cron/node.js应用程序安装在本地web服务器+python/php上的tiny Redis实例,以便在RabbitMQ再次可用后推送发送队列?>这里的关键词是“应该”,因为如果代理在有机会将消息写入磁盘之前发生故障,消息仍然可能丢失。是的,而且你可以从你的客户端处理它,因为提交失败你将永远无法与任何系统进行100%可靠的通信。故事结束了。计划故障并构建一个处理最常见和预期故障的系统。rabbitmq将在某个时候下降。你的系统需要知道如何处理这个问题。通常情况下,这是通过发布服务器端的内存或磁盘缓存中的消息来处理的,等待发送确认以从本地缓存中删除try..catch我需要一些代码来“重新发送”消息,或者broker在重新启动/崩溃后启动后执行此操作?它被称为
HA client
,您必须处理您的消息,然后在服务器启动后重试。
HA客户端
示例如下: