RocketMQ 如何保证全链路消息不丢失?

目录

1. RocketMQ 消息丢失的原因有哪些

2. 如何保证 RocketMQ 全链路消息不丢失

2.1 保证生产者发送消息到 MQ,消息不丢失

2.2 保证消息写入 Broker 后不丢失

2.3 保证 Broker 集群时,消息不丢失

2.4 保证消费者消费消息不丢失

3. 如果整个 MQ 服务都挂了呢,怎么保证消息零丢失


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 事务消息机制的执行流程:

【参照上图】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值