1.消息丢失
有这么一个场景,就是订单支付完成之后,订单系统会进行发送消息给RocketMQ集群,下游会有积分系统进行监听这个消息,进行消费然后给用户发放积分。在下面的这个场景中,通过查询日志发现了订单系统发送订单支付消息的日志。别的就没有了。
那我们进行分析
1. 发送订单支付消息给RocketMQ集群会出现消息丢失的情况的吗?
会出现消息丢失的情况,可能出现的原因:在发送的过程中,出现了网络抖动,导致了消息没有发送的MQ的集群上;MQ集群收到了消息,但是在进行保存的时候,由于自身的一些bug或者其他原因导致数据没有存储上也是可能的等。
2.消息到达了MQ,MQ会自己导致数据丢失吗?
答案也是可能的,举个例子,我们发送消息到MQ集群上,此时消息还是在os cache中,还是没有写入到磁盘,此时Broker机器发生了宕机,那么消息就会出现丢失的情况。
3.消息到达了MQ,并且MQ将数据写入了磁盘,数据还会丢失吗?
答案还是有可能的,比方说磁盘发生了故障,导致数据的丢失。
4.消费者拿到了消息,消息就不会丢失了吗?
答案还是有可能会丢失的,假如我们的消费者拿到了消息,此时还没有进行消费,此时系统会有自动提交offset的能力,自动提交了offset,同时咱们的消息者宕机了,那么再次重启之后,这条消息就会出现丢失的情况。
解决方案:
针对情况一:我们可以采用RocketMQ的事务消息机制来保证消息发送的可靠性。
步骤一 都失败了,那就没必要进行更新订单状态可以直接返回了;
步骤二失败了 此时就会有步骤五算是一个补偿机制来进行反查状态;
步骤三失败了,会触发步骤四进行RollBack;
步骤四失败了此时就会有步骤五算是一个补偿机制来进行反查状态;