我检查了RabbitMQ教程的"消息持久性"部分。但它有这样的注释:
将消息标记为持久消息并不能完全保证消息不会迷路。尽管它告诉RabbitMQ将消息保存到磁盘,RabbitMQ接受消息,但尚未保存。此外,RabbitMQ不执行fsync(2)对于每条消息,它可能只是保存到缓存中,而不是真正保存写入磁盘
但是,如果我真的需要持久队列,该怎么办?我可以使用哪些最佳实践?例如,如果消息在2分钟内未得到确认,我应该在数据库中设置"队列",并通过cron设置一些"重发器"吗?有更好的解决方案吗?
另外,如果我的消费者在处理消息后崩溃,而在发送ACK之前,该怎么办?
UPD:我的问题被标记为集群问题的"可能重复"。我不知道集群如何帮助解决这些问题。
请阅读此处关于Tx的保证交付
出版商会使用类似的东西:
ch.txSelect();
ch.basicPublish("", QUEUE_NAME,MessageProperties.PERSISTENT_BASIC,"nop".getBytes());
ch.txCommit();
注意:这可能会扼杀您的性能应用程序!
编辑
另请阅读"发布者确认"https://www.rabbitmq.com/confirms.html如@old_sound 所建议的
看看Publisher Confirms,它是为了解决了解RabbitMQ是否已持久化/复制您的消息的问题而制作的:https://www.rabbitmq.com/confirms.html