精彩推荐
接上一篇:RocketMQ入门到入土(二)事务消息&顺序消息
面试官常常喜欢问:RocketMQ 怎么保证的消息不丢失?
再遇到这个问题,就可以把这篇文章甩给他了~
一、消息发送过程
我们将消息流程分为如下三大部分,每一部分都有可能会丢失数据。
生产阶段:Producer通过网络将消息发送给Broker,这个发送可能会发生丢失,比如网络延迟不可达等。
存储阶段:Broker肯定是先把消息放到内存的,然后根据刷盘策略持久化到硬盘中,刚收到Producer的消息,再内存中了,但是异常宕机了,导致消息丢失。
消费阶段:消费失败了其实也是消息丢失的一种变体吧。
二、Producer生产阶段
Producer通过网络将消息发送给Broker,这个发送可能会发生丢失,比如网络延迟不可达等。
1、解决方案一
1.1、说明
有三种send方法,同步发送、异步发送、单向发送。我们可以采取同步发送的方式进行发送消息,发消息的时候会同步阻塞等待broker返回的结果,如果没成功,则不会收到SendResult,这种是最可靠的。其次是异步发送,再回调方法里可以得知是否发送成功。单向发送(OneWay)是最不靠谱的一种发送方式,我们无法保证消息真正可达。
1.2、源码
/**