欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RocketMQ生產者如何規(guī)避故障Broker方式詳解

 更新時間:2022年11月29日 10:21:48   作者:夢想實現家_Z  
這篇文章主要為大家介紹了RocketMQ生產者如何規(guī)避故障Broker方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

在消息發(fā)送過程中,生產者從NameServer中獲取到了指定Topic對應的Broker信息,在同步發(fā)送消息的代碼中,如果消息發(fā)送失敗,生產者默認是會重試兩次的。那么Broker有問題的情況下,無論重試多少次都是沒有意義的,消息生產者是如何規(guī)避這些故障Broker的呢?

收集故障Broker

我們在所有的發(fā)送消息源碼中都可以找到這樣一段代碼,可在DefaultMQProducerImpl類中查找:

this.updateFaultItem(mq.getBrokerName(), endTimestamp - beginTimestampPrev, true);

無論是發(fā)送成功還是失敗,RocketMQ生產者客戶端都會做這一步操作:

// 發(fā)送成功的話,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) {
    for (int i = latencyMax.length - 1; i >= 0; i--) {
        if (currentLatency >= latencyMax[i])
            return this.notAvailableDuration[i];
    }
    return 0;
}
private long[] notAvailableDuration = {0L, 0L, 30000L, 60000L, 120000L, 180000L, 600000L};

如果Broker產生故障,那么會創(chuàng)建一個FaultItem對象記錄故障的Broker,并把結果放進故障規(guī)避表faultItemTable中,數據格式如下:

"broker-a": {
  // broker名稱
  "name": "broker-a",
  "currentLatency": 發(fā)送消息消耗的時間,毫秒值之差,
  // 解除規(guī)避的時間,絕對時間
  "startTimestamp": 時間戳毫秒值
},
"broker-b": {
  // broker名稱
  "name": "broker-b",
  "currentLatency": 發(fā)送消息消耗的時間,毫秒值之差,
  // 解除規(guī)避的時間,絕對時間
  "startTimestamp": 時間戳毫秒值
}

發(fā)送成功的Broker設置的故障規(guī)避時間為0,發(fā)送失敗的Broker將被設置為規(guī)避30秒;

選擇Broker

MQFaultStrategy.selectOneMessageQueue()方法中,我們分三部分來分析如何選擇Broker。

  • 輪詢選擇一個可用的Broker
// 輪詢的基本套路,一個自增變量
int index = tpInfo.getSendWhichQueue().incrementAndGet();
for (int i = 0; i < tpInfo.getMessageQueueList().size(); i++) {
     // 通過對隊列數量取模,獲取選定的Broker所在的位置
     int pos = Math.abs(index++) % tpInfo.getMessageQueueList().size();
     if (pos < 0)
         pos = 0;
     MessageQueue mq = tpInfo.getMessageQueueList().get(pos);
     // 判斷Broker是否在規(guī)避時間內,如果不在規(guī)避時間內,就選擇這個Broker,否則繼續(xù)循環(huán)直至所有Broker都在規(guī)避時間內
     if (latencyFaultTolerance.isAvailable(mq.getBrokerName()))
         return mq;
}

1.輪詢的基本套路都是通過一個自增變量來對所有的Broker數量取模,這樣就可以命中一個Broker;

2.針對命中的Broker判斷是否在規(guī)避時間范圍內,不在規(guī)避時間內就可以返回;否則只能進入第二個方案;

  • 選擇一個相對延遲低的Broker
// 把所有規(guī)避列表中的Broker按延遲高低排序,并從延遲低的Broker中選擇一個
final String notBestBroker = latencyFaultTolerance.pickOneAtLeast();
int writeQueueNums = tpInfo.getQueueIdByBroker(notBestBroker);
// 判斷該Broker是否允許寫消息
if (writeQueueNums > 0) {
    final MessageQueue mq = tpInfo.selectOneMessageQueue();
    if (notBestBroker != null) {
        mq.setBrokerName(notBestBroker);
        mq.setQueueId(tpInfo.getSendWhichQueue().incrementAndGet() % writeQueueNums);
    }
    // 返回選中的Broker
    return mq;
}

1.從規(guī)避列表中找到延時比較低的Broker;

2.判斷該Broker是否允許寫消息,允許寫消息的話就直接返回,否則再進入下一個方案;

  • 默認的選擇
return tpInfo.selectOneMessageQueue();

最后直接輪詢一個Broker直接返回:

    public MessageQueue selectOneMessageQueue() {
        int index = this.sendWhichQueue.incrementAndGet();
        int pos = Math.abs(index) % this.messageQueueList.size();
        if (pos < 0)
            pos = 0;
        return this.messageQueueList.get(pos);
    }

該方案是默認方案,沒有開啟故障規(guī)避配置的話,所有Broker的選擇都是使用的該方案;

小結

RocketMQ通過設置故障規(guī)避表的方式,把所有的Broker的延遲數據都保留在故障規(guī)避表中,根據該列表制定了以下幾種策略:

1.優(yōu)先選擇不在規(guī)避時間范圍內的Broker;

2.如果所有Broker都在規(guī)避時間內,優(yōu)先選擇延遲低的Broker;

3.如果依然沒有選中合適的Broker,那么就直接挑一個Broker來用;

以上就是RocketMQ生產者如何規(guī)避故障Broker方式詳解的詳細內容,更多關于RocketMQ生產者規(guī)避故障Broker的資料請關注腳本之家其它相關文章!

相關文章

  • Java分布式鎖的三種實現方案

    Java分布式鎖的三種實現方案

    本文主要介紹了Java分布式鎖的三種實現方案。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • java隨機生成一個名字和對應拼音的方法

    java隨機生成一個名字和對應拼音的方法

    這篇文章主要介紹了java隨機生成一個名字和對應拼音的方法,涉及java針對數組及隨機數操作的相關技巧,需要的朋友可以參考下
    2015-07-07
  • 使用maven?shade插件解決項目版本沖突詳解

    使用maven?shade插件解決項目版本沖突詳解

    這篇文章主要為大家介紹了使用maven?shade插件解決項目版本沖突詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • spring多數據源配置實現方法實例分析

    spring多數據源配置實現方法實例分析

    這篇文章主要介紹了spring多數據源配置實現方法,結合實例形式分析了spring多數據源配置相關操作技巧與使用注意事項,需要的朋友可以參考下
    2019-12-12
  • 詳解常用的Spring Bean擴展接口

    詳解常用的Spring Bean擴展接口

    本篇文章主要介紹了一些常用的Spring Bean擴展接口以及它們的簡單用法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • this關鍵字詳解

    this關鍵字詳解

    這篇文章主要介紹了this關鍵字,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • springboot 整合郵件發(fā)送功能

    springboot 整合郵件發(fā)送功能

    這篇文章主要介紹了springboot 整合郵件發(fā)送功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Java實現二叉查找樹的增刪查詳解

    Java實現二叉查找樹的增刪查詳解

    二叉查找樹(ADT)是一個具有對于樹種的某個節(jié)點X,它的左節(jié)點都比X小,它的右節(jié)點都比X大的二叉樹。本文將用Java實現二叉查找樹的增刪查,需要的可以參考一下
    2022-06-06
  • Java中Jackson快速入門

    Java中Jackson快速入門

    這篇文章主要介紹了Java中Jackson快速入門,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Java根據key獲取枚舉值的操作方法

    Java根據key獲取枚舉值的操作方法

    枚舉(enum)算一種“語法糖”,是指一個經過排序的、被打包成一個單一實體的項列表,一個枚舉的實例可以使用枚舉項列表中任意單一項的值,本文給大家介紹了Java?如何快速根據?key?獲取枚舉的值,需要的朋友可以參考下
    2024-07-07

最新評論