前言
通过之前文章的阅读,有关RocketMQ的底层原理相信小伙伴们已经有了一个比较清晰的认识。
那么接下来王子想跟大家讨论一个话题,如果我们的项目中引入了MQ,势必要面对的一个问题,就是 消息丢失问题 ,今天我们就来聊聊消息是怎么丢失的。
现在假设我们的业务是这样的,用户通过订单系统下了一个订单,订单系统完成支付后会发送消息给RocketMQ,然后积分系统会从RocketMQ中消费消息,去给用户增加积分,如下图:
但是突然有一天有用户反映,支付订单之后,自己的积分并没有增长,这是为什么呢?
经过排查日志,我们只发现了推送消息给MQ的日志,而没有发现积分系统消费这条消息的日志,这就导致了积分系统并没有给用户发放积分。
也就是说,消息在传输过程中丢失了。
在系统的核心链路中,如果发生消息丢失的问题,可能会产生恶劣的后果,为了解决此类问题,我们必须弄明白什么时候会发生消息丢失。
订单系统推送消息过程中会丢失消息吗?
我们先来看一下整个流程的第一步,订单系统在支付成功之后,一定会把支付成功的消息推送给MQ,那么在这个推送的过程中,消息可能丢失吗?
答案是肯定的,一定会存在消息丢失的情况。
比较常见的情况就是网络抖动,在推送消息这一过程中是通过网络进行通信的,那么这个时候如果恰巧网络出现了故障,