版本:4.2.0
producer在发送消息之前并不知道broker的健康状态,如果broker正在繁忙的处理消息,大量的发送请求会增加broker的负担,MQ为了缓解这个问题增加了broker故障机制,利用发送的时长来预测broker的可用时间
默认是关闭的,可以通过这个是打开:
defaultMQProducer.setSendLatencyFaultEnable(true);
先来看看如何预测broker的不用时间的
private SendResult sendDefaultImpl(Message msg, CommunicationMode communicationMode, SendCallback sendCallback, long timeout) throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
。。。
try {
beginTimestampPrev = System.currentTimeMillis();
sendResult = this.sendKernelImpl(msg, mq, communicationMode, sendCallback, topicPublishInfo, timeout);
endTimestamp = System.currentTimeMillis();
this.updateFaultItem(mq.getBrokerName(), endTimestamp - beginTimestampPrev, false);
switch(communicationMode) {
case ASYNC:
return null;
case ONEWAY:
return null;
case SYNC:
if (sendResult.getSendStatus() == SendStatus.SEND_OK || !this.defaultMQProducer.isRetryAnotherBrokerWhenNotStoreOK()) {
return sendResult;
}
}
} catch (RemotingException var24) {
&n

在RocketMQ 4.2.0版本中,Producer在发送消息时若未预知Broker健康状态,可能导致Broker负担加重。为解决此问题,MQ引入了基于请求时长预测Broker可用性的故障机制。当发送请求超时,会更新Broker的不可用时间,并在选择Broker时避免使用故障列表中的节点。若所有Broker都在故障列表中,则从前半部分随机选取一个相对可用的Broker进行消息发送。

1794

被折叠的 条评论
为什么被折叠?



