rocketmq消息发送容错策略和优雅关机

1.近期研究rocketmq的源码,发现producer在发送消息时,先根据路由选择broker的MessageQueue,在选择发送队列时,

会根据sendLatencyFaultEnable值进行容错处理。

DefaultMQProducer设置参数入口:

rocketmq消息发送容错策略和优雅关机

2.发送消息源码

(1)获取topic路由信息:TopicPublishInfo topicPublishInfo = this.tryToFindTopicPublishInfo(msg.getTopic());

(2)根据规则选择队列:

rocketmq消息发送容错策略和优雅关机

先判断sendLatencyFaultEnable若为true,则会判断当前选择的队列所在broker是否可用,如不可用则将消息发送其他broker。

由于该参数默认为false,则在选择发送队列时,若第1次发送消息失败(broker不可用),第2次重试发送选择队列时,可能仍属于该不可用的broker的队列,故发送重试时仍可能发送失败。

3.在升级或迁移Broker时,当Broker为多主多从架构部署,为了平滑迁移,可考虑如下方式,采用RocketMQ一种优雅关闭Broker的方法,先清除Broker的写权限,过40s后,所有客户端都会更新Broker路由信息,此时再shutdown 关闭Broker就不会发生发送消息失败的情况,因为所有消息通过容错策略发往了其他Broker:

rocketmq消息发送容错策略和优雅关机

操作成功后,可看到topic信息变化:

rocketmq消息发送容错策略和优雅关机

发送消息时可选的MessageQueue列表已去除broker-a:

rocketmq消息发送容错策略和优雅关机

4.升级或迁移broker-a完成,重新恢复该Broker的写权限:

rocketmq消息发送容错策略和优雅关机

producer端有定时任务定时重新同步路由信息,再次发送消息时,消息队列重新可选择broker-a队列:

rocketmq消息发送容错策略和优雅关机