Dubbo中的一個關鍵接口LoadBalance,dubbo是按照其中的規則來調用多台provider的服務的。
先看一下接口的實現類圖:
從上圖中我們可以看到dubbo提供了四種算法來實現負載均衡。
1.RandomLoadBalance:隨機,按權重設置隨機概率。
從字面意思也很好理解,根據每個invoker提前設置好的權重隨機分配,看一下源碼的實現:
可以看出其實現邏輯是如果所有的invoker的權重都一樣,則隨機給出一個invoker,
否則按照權重進行分配,按照權重進行分配相信大家都有接觸過,但是dubbo的這種實現方式還是很優雅,很值得學習和借鑒的,就是我上圖中標記出的部分,
可以看到dubbo是將所有的invoker的權重都加起來,在這個總權重范圍內隨機生成一個數字,用這個數字依次減去沒個invoker的權重,當值變為<時,即是這個invoker來執行。
例如,有四個invoker,權重分別是:1,2,3,4,總權重為10,隨機生成數字為5,則5-1=4,4-2=2,2-3=-1<0,即可判定是權重為3的invoker來執行,
按照這個邏輯:
權重為1的會執行的隨機數:0.
權重為2的會執行的隨機數:1~2.
權重為3的會執行的隨機數:3,4,5.
權重為4的會執行的隨機數:6,7,8,9.
2.ConsistentHashLoadBalance:一致性哈希算法
相同參數的請求總是發到同一提供者。
但是缺省只對第一個參數進行hash,請注意這些默認參數:
3.LeastActiveLoadBalance:最小活躍數負載均衡
最少活躍調用數,相同活躍數的隨機,活躍數指調用前后計數差。
使慢的提供者收到更少請求,因為越慢的提供者的調用前后計數差會越大。
這里牽扯到一個問題,如何統計活躍數呢?我們來看源碼實現:
每次調用該invoker時會將數字+1,調用完成后-1,這樣執行慢的invoker在同一時間節點上的活躍數字就會比較大,快的就會比較小
當只有一個最小活躍數的invoker時直接返回該invoker
當多個invoker活躍數一致但權重不一致時就根據上文的隨機權重算法進選擇
當多個invoker活躍數一致權重也一致時,就從中隨機進行返回。
4.RoundRobinLoadBalance:根據權重進輪訓,輪訓的缺點就是無法顧及invoker的執行效率,有可能將請求積壓在某一處理較慢的provider上。
參考大神文章:https://www.jianshu.com/p/53feb7f5f5d9