前言
在消息发送过程中,生产者从NameServer
中获取到了指定Topic
对应的Broker
信息,在同步发送消息的代码中,如果消息发送失败,生产者默认是会重试两次的。那么Broker
有问题的情况下,无论重试多少次都是没有意义的,消息生产者是如何规避这些故障Broker
的呢?
收集故障Broker
我们在所有的发送消息源码中都可以找到这样一段代码,可在DefaultMQProducerImpl
类中查找:
this.updateFaultItem(mq.getBrokerName(), endTimestamp - beginTimestampPrev, true);
复制代码
无论是发送成功还是失败,RocketMQ生产者客户端都会做这一步操作:
// 发送成功的话,isolation传false,失败isolation传true
public void updateFaultItem(final String brokerName, final long currentLatency, boolean isolation) {
if (this.sendLatencyFaultEnable) {
long duration = computeNotAvailableDuration(isolation ? 30000 : currentLatency);
this.latencyFaultTolerance.updateFaultItem(brokerName, currentLatency, duration);
}
}
private long computeNotAvailableDuration(final long currentLatency) {
f