深入RocketMQ-消息原理篇

RocketMQ 原理分析-消息原理

本篇原理分析主要讲解消息原理方面

RocketMQ 如何保证消息不丢失/保证可靠性

消息在 RocketMQ 流转大概可以分为三个阶段:发送阶段、存储阶段、消费阶段,那么可靠性就要从这三个阶段考虑。

  • 生产者发送消息时主要依靠发送确认来确保消息可靠性的。同步异步发送都可以获取到发送状态,通过这个发送状态来判断本次消息是否成功发送。另外,发送消息时还可以指定一个超时时间,如果超出这个超时时间可以再次发送。

  • 消费者消费消息时也存在一个消费确认机制,当消费者消费消息成功或失败都会给 Broker 返回消费状态,消费成功则结束本次流程;消费失败 Broker 则会重新发送消息。如果停电、宕机 Broker 都不会认为消费成功,也会继续重新投递。

  • Broker 存储阶段保证消息不丢失的手段就是把消息记录到 CommitLog 中,保证消息不会丢失。

关于保证成功记录到 CommitLog 有两种方式:

  • 同步刷盘,生产者把消息发送到 Broker 后,只有 Broker 成功地把消息写入到 CommitLog 后,才能给生产者返回发送成功的 ACK。这种方式可靠性更高,但是牺牲了效率。

  • 异步刷盘,Broker 把消息写入到 CommitLog 采用后台异步线程刷盘的方式,刷盘完成后回调接口返回发送成功的 ACK。可以降低读写延迟,提高 RocketMQ 的吞吐量,但是当 Broker 宕机时会丢失部分未从内存中写入到文件的消息。

RocketMQ 中消息重复的问题

在分布式消息队列中,同时确保消息不丢失和不重复是很难的,RocketMQ 选择了保证消息不丢失,消息重复的问题需要在业务端自行解决。

在 RocketMQ 中,造成消息重复的根本原因是网络波动,会导致消费者收到两条一样的消息。

RocketMQ 不保证消息不重复,如果要严格确保不重复,需要在业务端去重,可以使用如下手段:

  • 多次消费不影响:消费端的消息处理业务逻辑保证幂等性,这样无论消息消费多少次都对业务没有影响;

  • 过滤重复消息:生产者发送时确保每一条消息都有唯一编号(业务相关的比如说是订单号),建立一个消费记录表,当拿到这个消息时保存到数据库,给这个消息做唯一约束,当出现重复消费时,唯一约束就不满足,那么就抛弃这条消息。

RocketMQ 消息堆积问题

消息队列其中一个很重要的作用就是削峰,那么消息队列必然有一定的消息堆积能力来顶住请求的洪峰来保证后端服务的稳定性。

C/C++Linux服务器开发高级架构师/C++后台开发架构师​免费学习地址

另外还整理一些C++后台开发架构师 相关学习资料,

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值