实际生产环境中RocketMQ-消息零丢失方案

本文详细解析了RocketMQ如何确保消息不丢失,包括生产者使用事务消息机制、Broker配置同步刷盘和Dledger主从架构、消费者避免异步消费以及应对NameServer故障的降级方案。事务消息通过半消息机制、状态回查和补偿流程保证分布式事务一致性,同时探讨了在不同异常情况下的消息处理策略,确保消息的可靠传递。

在考虑如何保证消息不丢失时,首先考虑下在那些情况下会出现消息丢失,在存在消息丢失的情况下又如何做来避免消息丢失。

这个图是生产者消息者实际生产上的一个流程图。其中,1,2,4三个场景都是跨网络的,而跨网络就肯定会有丢消息的可能。然后关于3这个环节,通常MQ存盘时都会先写入操作系统的缓存page cache中,然后再由操作系统异步的将消息写入硬盘。这个中间有个时间差,就可能会造成消息丢失。如果服务挂了,缓存中还没有来得及写入硬盘的消息就会丢失。

RocketMQ消息零丢失方案

生产者使用事务消息机制保证消息零丢失

       这个结论比较容易理解,因为RocketMQ的事务消息机制就是为了保证零丢失来设计的,并且经过阿里的验证,肯定是非常靠谱的。我们以最常见的电商订单场景为例,来简单分析下事务消息机制如何保证消息不丢失。我们看下下面这个流程图:

RocketMQ实现事务消息主要分为两个阶段:正常事务的发送及提交、事务信息的补偿流程 整体流程为:

正常事务发送与提交阶段:生产者发送一个半消息给MQServer(半消息是指消费者暂时不能消费的消息)服务端响应消息写入结果,半消息发送成功,开始执行本地事务,根据本地事务的执行状态执行Commit或者Rollback操作

事务信息的补偿流程:如果MQServer长时间没收到本地事务的执行状态会向生产者发起一个确认回查的操作请求,生产者收到确认回查请求后,检查本地事务的执行状态。根据检查后的结果执行Commit或者Rollback操作, 补偿阶段主要是用于解决生产者在发送Commit或者Rollback操作时发生超时或失败的情况。

 备注:事务消息在一阶段对用户不可见 事务消息相对普通消息最大的特点就是一阶段发送的消息对用户是不可见的,也就是说消费者不能直接消费。这里RocketMQ的实现方法是原消息的主题与消息消费队列,然后把主题改成 RMQ_SYS_TRANS_HALF_TOPIC ,这样由于消费者没有订阅这个主题,所以不会被消费。

1、为什么要发送个half消息?有什么用?

        这个half消息是在订单系统进行下单操作前发送,并且对下游服务的消费者是不可见的。那这个消息的作用更多的体现在确认RocketMQ的服务是否正常。相当于嗅探下RocketMQ服务是否正常,并且通知RocketMQ,我马上就要发一个很重要的消息了,你做好准备。

2.half消息如果写入失败了怎么办?

       &nbs

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员路同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值