RabbitMQ 中真正持久的队列

Really durable queue in RabbitMQ

我检查了 RabbitMQ tutorial 的 "Message durability" 部分。但是它有这个注释:

Marking messages as persistent doesn't fully guarantee that a message won't be lost. Although it tells RabbitMQ to save the message to disk, there is still a short time window when RabbitMQ has accepted a message and hasn't saved it yet. Also, RabbitMQ doesn't do fsync(2) for every message -- it may be just saved to cache and not really written to the disk

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

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

UPD:我的问题被标记为 "possible duplicate" 聚类问题。我不知道集群如何帮助解决这些问题。

请阅读here关于使用 Tx 保证交付

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

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

注意:这会终止您的性能应用程序!

编辑

另请参阅@old_sound

所建议的"Publisher Confirms" https://www.rabbitmq.com/confirms.html

查看 Publisher Confirm 以解决了解 RabbitMQ 是否有 persisted/replicated 您的消息的问题:https://www.rabbitmq.com/confirms.html