浅记 RocketMQ 消息丢失问题

本篇文章主要浅浅介绍一下 RocketMQ 消息丢失问题及解决办法~~

RocketMQ 核心流程:「生产者发送消息到 Broker」->「Broker 刷盘/同步」->「消费者从 Broker 中消费消息」

下面情况可能会出现消息丢失:

生产者往 Broker 中发送消息

同步发送

生产者往 Broker 中同步发送消息时可能会出现以下几种情况:

对于前两种情况,生产者会在一定时间后重发消息,类似于 TCP 的超时重传机制;对于后四种情况,生产者会收到对应的状态,可根据状态采取不同策略处理消息

事务消息

除了使用同步发送方式保证消息不丢失外,还可以使用 RocketMQ 分布式事务保证消息不丢失

首先会向 Broker 发送一个 half 消息,如果规定时间内 Broker 没有收到本地事务的状态,会间隔规定时间去回查本地事务的状态

问题一:如果 half 消息发送失败怎么处理?

问题二:如果本地事务订单入库失败怎么处理?

问题三:如何优化的处理下单后等待支付成功?

Broker 刷盘

Broker 刷盘有两种方式,同步刷盘和异步刷盘

Broker 主从同步

和 Broker 刷盘一样,Broker 的主从同步也有两种方式,同步主从同步和异步主从同步

消费者从 Broker 中消费消息

当 Broker 推送消息给消费者,但如果规定时间内没有收到消费者返回的 ACK,表示可能是消息消费失败或者 ACK 丢失,那么 Broker 会重新推送消息给消费者

上面机制一定能保证消息成功被消费者消费,但要注意的是必须基于同步消费的前提下,如果是异步消费就可能消费失败的情况

整个 RocketMQ 宕机

当整个 RocketMQ 宕机时,只能设计一个降级方案,比如将消息先缓存到某个地方,当 RocketMQ 恢复后再重新处理

零丢失方案

参考文章