Dubbo 中有四種負(fù)載均衡策略:RandomLoadBalance(按權(quán)重隨機(jī))、RoundRobinLoadBalance(輪詢)、LeastActiveLoadBalance(最少活躍數(shù))迹栓、ConsistentHashLoadBalance(一致性哈希)
1. RandomLoadBalance 隨機(jī)策略
- 如果所有的權(quán)重一樣兑燥,則隨機(jī)挑選一個節(jié)點模狭;
- 節(jié)點權(quán)重不一樣:A(1),B(2),C(3),D(4)
- 先根據(jù)總權(quán)重10 隨機(jī)生成一個數(shù)缩焦,比如說3;
- 接下來遍歷所有節(jié)點:3-1=2娇未;2-2=0墨缘;0-3=-3,知道offset< 0
- 3<0 則返回C節(jié)點
2. RoundRobinLoadBalance
輪詢是Dubbo的負(fù)載均衡策略零抬;
- Round-Robin Scheduling: 按照1-N(節(jié)點數(shù)量) 順序分配節(jié)點镊讼,不考慮權(quán)重。如果某一節(jié)點處理速度較慢平夜,那么該節(jié)點就會累計大量的請求蝶棋。
- Weighted Round-Robin Scheduling(按照權(quán)重的輪詢):
3. LeastActiveLoadBalance
假設(shè)有A、B兩個節(jié)點忽妒。A玩裙、B兩個節(jié)點分別處理兩個請求,計數(shù)分別+1段直;如果B節(jié)點處理請求比A快吃溅,B處理完請求后,計數(shù)-1鸯檬。于是A的計數(shù)為1决侈,B的計數(shù)為0. 下次請求過來時,B的計數(shù)比較小喧务,于是B節(jié)點獲得請求赖歌。如果A枉圃、B的計數(shù)值一樣,則按照節(jié)點的權(quán)重隨機(jī)選惹握尽(參考RandomLoadBalance)。
擴(kuò)展:ActiveLimitFilter可以用來限制客戶端的并發(fā)請求數(shù)量
4. ConsistentHashLoadBalance
相同參數(shù)的請求痊土,最終都會請求到一個節(jié)點上去肄扎。
- 如果某一個節(jié)點down了,節(jié)點總數(shù)-1赁酝,hash/(N-1)和原來的hash/(N)的差別比較大犯祠,導(dǎo)致緩存失效,會引起服務(wù)端較大的震蕩酌呆。N越大衡载,震蕩越大。
- 一致性Hash算法解決上述問題
-
環(huán)形Hash空間
按照常用的Hash取模的方式隙袁,將key分布在0~(2^32)-1的數(shù)字空間中痰娱,我們可以將這些數(shù)字頭尾相連,想象成一個閉合的環(huán)形菩收。
- 采用一致性Hash算法梨睁,把請求參數(shù)、節(jié)點映射到上述的數(shù)字空間中娜饵。
- 按照順時針的順序坡贺,找到最近的節(jié)點。
- 如果某一個節(jié)點down了箱舞,請求只會按照順時針尋找到下一個節(jié)點遍坟。于是只影響了一個節(jié)點。但是這樣增加了被影響節(jié)點的訪問壓力晴股,為了分散這種影響愿伴,可以使用虛擬節(jié)點。
- 假如有N個真實節(jié)點,把每個真實節(jié)點映射成M個虛擬節(jié)點,再把 M*N 個虛擬節(jié)點, 散列在圓環(huán)上. 各真實節(jié)點對應(yīng)的虛擬節(jié)點相互交錯分布這樣,某真實節(jié)點down后,則把其影響平均分擔(dān)到其他所有節(jié)點上.(中間方案)