目录
1. RocketMQ 消息丢失的原因有哪些
所有 MQ 产品消息丢失的元凶无非就两个:网络+缓存
这两个原因落地到具体的场景:
1.生产者发送消息到 MQ,消息丢失
2.消息写入 MQ,消息丢失
① 消息写入内存后非正常关机;
② 消息写入磁盘后,磁盘坏了;
③ master 数据备份到 slave 由于网络原因导致备份失败;
3.消息者消费 MQ ,消息丢失
2. 如何保证 RocketMQ 全链路消息不丢失
2.1 保证生产者发送消息到 MQ,消息不丢失
【方案一】同步发送 + 消息重试机制
Producer 发送消息的三种方式:
1.单向发送:消息发送出去就不管了.
2.同步发送: 同步等待 Broker 响应.
3.异步发送: 异步处理 Broker 通知.
同步发送+消息重试:生产者向 mq 发送消息,mq 收到消息成功就会回复 ack,如果生产者没收到 ack,就会重试再次发送消息到 mq,通过这种机制来保证消息不丢失。(重试的消息会被加入到重试队列中,重试一定次数还未成功发送就会被加入到死信队列中)
PS:同步发送有个缺点,生产者在等待服务端回复ack的过程,他干不了别的事,所以比较综合的方式就是采用异步发送的方式,异步发送它会注册一个 sendCallback 回调监听器,相当于找了个小弟给你干活,可以在小弟的这个回调方法里面写逻辑,如果消息发送失败了,让小弟去重试就行。
【方案二】RocketMQ 的事务消息机制
⭐ RocketMQ 事务消息机制的思想:
首先,事务消息的本质就是,生产者这边处理一个本地事务,消费者这边处理一个本地事务,这两个事务要保证一个原子性,但这是一个分布式事务,直接保证这两个事务的一致性很难做到; 而 RocketMQ 的事务机制是怎么保证这两个本地事务的一致性的呢,它是通过保证生产者处理本地事务和往 RocketMQ 发消息这两个操作是原子性的,然后在消费者这一端,只要生产者消息成功发送到了 MQ,MQ 就可以通过重试的机制将消息发送给消费者,哪怕当时消费者的事务处理失败了,那么经过多次的重试,最终消费的事务也会执行成功。所以他的本质是通过保证事务消息的一半,从而来保证整体业务逻辑的事务性。
⭐ RocketMQ 事务消息机制的执行流程:
【参照上图】
1.生产者向 MQ 发送半消息(half)&#