本文主要是介绍【退役之重学Java】如何处理消息丢失问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
即如何保证消息的可靠性传输
一、场景
- 网络丢包,导致丢失消息
- RabbitMQ 没来得及保存消息,就挂掉了
- 消费者接受到消息,但没处理完,消费者挂掉了
二、怎么办
- 生产者
将 channel 设置为 confirm 模式,是异步模式,不会阻塞 - RabbitMQ
- queue 设置为持久化的(保证 RabbitMQ 持久化 queue 的元数据);
- 发送消息的时候将消息的 deliveryMode 设置为2(保证消息持久化)
- 此时 RabbitMQ 就会将消息持久化到磁盘上去。
- 持久化可以跟生产者那边的 confirm 机制配合起来,只有消息被持久化到磁盘之后,才会通知生产者 ack,所以哪怕实在持久化到磁盘之前,RabbitMQ 挂了,数据丢了,生产者收不到 ack, 你也是可以自己重发的。
- 哪怕是你给RabbitMQ 开启了持久化机制,也有一种可能,就是这个消息写到了 RabbitMQ 中,但是还没来得及持久化到磁盘上,结果不巧,此时 RabbitMQ 挂了,就会导致内存里的一点数据会丢失
- 消费者
如果打开了消费者的 autoAck 机制,消费到数据之后(还没有消费完),消费者会自动通知 RabbitMQ,已经消费完这条消息了。
就是说,如果你消费到一条消息,还在处理中,autoAck 机制会自动告诉 RabbitMQ 已经消费完了。这是如果消费者系统宕机,就会丢失消息。
所以说,消费者方面需要关闭 autoAck,而手动 Ack。
这篇关于【退役之重学Java】如何处理消息丢失问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!