开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
前言
上一篇文章 「日拱一卒」带你探索RocketMQ消息发送(一),我们简单了解了 RocketMQ 的消息发送方式以及 Topic 路由信息的获取,接下来,我们继续来学习下RocketMQ消息发送的进阶知识吧~
如何确保消息发送是可靠的?
RocketMQ 的 Producer 根据 Topic 路由机制查询到路由信息后,会默认使用负载均衡算法,将请求打到对应的 Broker 上。那么试想,如果 Producer 发送消息失败了,这个消息丢了,那业务是不是会受到影响?我们能不能确保 Producer 发送的消息是可靠的呢?
当然,Producer 为了保证消息能够成功地到达 Broker ,它有两种机制来保障发送消息的高可用:
- 消息发送重试机制。顾名思义,就是 RocketMQ 发送消息失败了,会按照配置的重试次数来进行重试。默认的重试次数是两次
- 故障规避机制。所谓故障规避,当消息第一次发送失败了,如果下一次重试发送时还发送到刚刚失败的那个 Broker 上,那么发送失败的概率还是比较大。为了保障每次重试都是有效果的,发送重试时会尽量避开发送到刚刚失败的 Broker,而是选择集群中的其他 Broker 进行发送,以此来提高消息发送的成功率。
浅析消息发送源码
RocketMQ 具体是怎么实现消息发送的?我们这里根据源码来做进一步的探索!
首先,RocketMQ 消息实体类是 Message,它位于 org.apache.rocketmq.common.message 包之下,主要具备的属性有:
- String topic : MQ 消息所属的主题
- int flag:消息标记
- Map properties:扩展属性
- byte[] body: 消息体
小结
今天我们主要学习了 RocketMQ 的消息发送重试机制、故障规避机制来保障消息发送的高可用;再简单看了下消息实体类 Message 。明天的文章,将会有更加细致的源码解析,大家多多关注噢~