消息丢失的原因可以从生产者,中间件,消费者 三个方面着重考虑。要么是重启,宕机,异常情况,要么是策略设置不合理。了解了MQ 的工作过程和原理,这个问题还是比较容易回答的。从各个角度分析一下就行。实际上遇到的问题可能会更加复杂一些,梳理清楚处理事情的逻辑,定位问题也会更加迅速,解决问题自然也不在话下。实际工作中找问题的root cause 的那个过程更能看出一个人思考问题的方式,解决问题的速度体现了一个人的能力。
生产者未成功发送消息
生产者发送消息到MQ服务器时,可能因网络故障、MQ服务宕机或配置错误导致消息未到达Broker。又或者生产者代码逻辑错误,比如没有配置持久化。(实际上可能只会对于热点消息做暂时的持久化,毕竟持久化数据太多会给系统造成压力)
Broker未持久化消息
消息到达Broker后,若未开启持久化(如磁盘存储),Broker重启或崩溃会导致内存中的消息丢失。
消费者未正确处理消息
消费者拉取消息后,若未返回确认(ACK)且发生异常,Broker可能误判消息未消费而重复投递,或直接丢弃消息。消费者处理消息的速度过慢或者出现故障,导致消息过期被清除。
网络分区或高负载
网络分区可能导致生产者和Broker、消费者和Broker之间通信中断,消息在传输过程中丢失。
消息过期或队列满
消息设置了TTL(生存时间)或队列达到存储上限时,Broker可能自动清理未消费的消息。队列的溢满策略设置的不合理,新来的消息直接被丢弃。
手动删除或运维错误
人为误操作(如删除队列、重置Offset)或运维脚本错误可能导致消息丢失。这种情况发生的概率比较小一些。
1万+

被折叠的 条评论
为什么被折叠?



