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
我检查了 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