高可用设计与实现

RocketMQ源码分析系列之五:消息发送高可用设计_消息中间件

上面左图我们能看出高可用设计包括两个主要方面:队列选择与重试;右图展示了路由信息的基本原理。

关于队列选择,我们已经在“RocketMQ源码分析系列之三:负载均衡之MessageQueue与消息队列选择”中进行了详细介绍,这里不在赘述。

关于重试次数,其实就是类DefaultMQProducerImplsendDefaultImpl方法中下面代码段(详细介绍见“RocketMQ源码分析系列之四:消息发送”):

int timesTotal = communicationMode == CommunicationMode.SYNC ? 1 + this.defaultMQProducer.getRetryTimesWhenSendFailed() : 1;
int times = 0;
String[] brokersSent = new String[timesTotal];
for (; times < timesTotal; times++) {
//注意mq的赋值,第一次一定为null,每执行一次for循环就把当前选择的MessageQueue实例赋值给mq
//如果发送消息成功,则跳出for循环,如果失败则执行下一次循环,此时mq的值就是上一个循环中失败的那个
String lastBrokerName = null == mq ? null : mq.getBrokerName();

本节内容主要是把RocketMQ中关于“消息发送高可用”的内容合并到一起回顾一下。


结束

作为自己阅读源码的随记,不可避免存在问题和遗漏,欢迎指正错误和讨论。


原文在我的公众号“平凡的程序员”。

RocketMQ源码分析系列之五:消息发送高可用设计_消息中间件_02