17. Dubbo原理解析-集羣&容錯之負載均衡

LoadBalance負載均衡, 負責從多個 Invokers中選出具體的一個Invoker用於本次調用,調用過程中包含了負載均衡的算法,調用失敗後需要重新選擇

LoadBalance接口定義

@SPI(RandomLoadBalance.NAME)

public interface LoadBalance{

@Adaptive("loadbalance")

<T> Invoker<T> select(List<Invoker<T>> invokers,URL url, Invocation invocation)throws RpcException;

}

類註解@SPI說明可以基於Dubbo的擴展機制進行自定義的負責均衡算法實現,默認是隨機算法

方法註解@Adaptive說明能夠生成設配方法

Select方法設配類通過url的參數選擇具體的算法, 在從invokers集合中根據具體的算法選擇一個invoker

 

 

1. RandomLoadBalance: 隨機訪問策略,按權重設置隨機概率,是默認策略

1)獲取所有invokers的個數

2)遍歷所有Invokers, 獲取計算每個invokers的權重,並把權重累計加起來

每相鄰的兩個invoker比較他們的權重是否一樣,有一個不一樣說明權重不均等

3)總權重大於零且權重不均等的情況下

按總權重獲取隨機數offset = random.netx(totalWeight);

遍歷invokers確定隨機數offset落在哪個片段(invoker上)



4)權重相同或者總權重爲0, 根據invokers個數均等選擇

invokers.get(random.nextInt(length))

 

      

2. RoundRobinLoadBalance:輪詢,按公約後的權重設置輪詢比率

1)獲取輪詢key  服務名+方法名

獲取可供調用的invokers個數length

設置最大權重的默認值maxWeight=0

設置最小權重的默認值minWeight=Integer.MAX_VALUE

2)遍歷所有Inokers,比較出得出maxWeight和minWeight

3)如果權重是不一樣的

根據key獲取自增序列

自增序列加一與最大權重取模默認得到currentWeigth

遍歷所有invokers篩選出大於currentWeight的invokers

設置可供調用的invokers的個數length

4)自增序列加一併與length取模,從invokers獲取invoker

 

 

3. LeastActiveLoadBalance: 最少活躍調用數, 相同的活躍的隨機選擇,

活躍數是指調用前後的計數差, 使慢的提供者收到更少的請求,因爲越慢的提供者前後的計數差越大。

活躍計數的功能消費者是在ActiveLimitFilter中設置的



4. 最少活躍的選擇過程如下:

1)獲取可調用invoker的總個數

初始化最小活躍數,相同最小活躍的個數

相同最小活躍數的下標數組

等等

2)遍歷所有invokers, 獲取每個invoker的獲取數active和權重

找出最小權重的invoker

如果有相同最小權重的inovkers, 將下標記錄到數組leastIndexs[]數組中

累計所有的權重到totalWeight變量

3)如果invokers的權重不相等且totalWeight大於0

按總權重隨機offsetWeight = random.nextInt(totalWeight)

計算隨機值在哪個片段上並返回invoker


4)如果invokers的權重相等或者totalWeight等於0,均等隨機

 

 

5. ConsistentHashLoadBalance:一致性hash, 相同參數的請求總是發到同一個提供者,當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。對於一致性哈希算法介紹網上很多,這個給出一篇http://blog.csdn.net/sparkliang/article/details/5279393供參考,讀者請自行閱讀ConsistentashLoadBalance中對一致性哈希算法的實現,還是比較通俗易懂的這裏不再囉嗦。
發佈了69 篇原創文章 · 獲贊 99 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章