Dubbo3 負載均衡

2022-03-30 15:54 更新

Dubbo 提供的集群負載均衡策略

在集群負載均衡時,Dubbo 提供了多種均衡策略,缺省為 random 隨機調(diào)用。

具體實現(xiàn)上,Dubbo 提供的是客戶端負載均衡,即由 Consumer 通過負載均衡算法得出需要將請求提交到哪個 Provider 實例。

可以自行擴展負載均衡策略,參見:負載均衡擴展

負載均衡策略

目前 Dubbo 內(nèi)置了如下負載均衡算法,用戶可直接配置使用:

算法 特性 備注
RandomLoadBalance 加權(quán)隨機 默認算法,默認權(quán)重相同
RoundRobinLoadBalance 加權(quán)輪詢 借鑒于 Nginx 的平滑加權(quán)輪詢算法,默認權(quán)重相同,
LeastActiveLoadBalance 最少活躍優(yōu)先 + 加權(quán)隨機 背后是能者多勞的思想
ShortestResponseLoadBalance 最短響應(yīng)優(yōu)先 + 加權(quán)隨機 更加關(guān)注響應(yīng)速度
ConsistentHashLoadBalance 一致性 Hash 確定的入?yún)?,確定的提供者,適用于有狀態(tài)請求

Random

  • 加權(quán)隨機,按權(quán)重設(shè)置隨機概率。
  • 在一個截面上碰撞的概率高,但調(diào)用量越大分布越均勻,而且按概率使用權(quán)重后也比較均勻,有利于動態(tài)調(diào)整提供者權(quán)重。
  • 缺點:存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當(dāng)請求調(diào)到第二臺時就卡在那,久而久之,所有請求都卡在調(diào)到第二臺上。

RoundRobin

  • 加權(quán)輪詢,按公約后的權(quán)重設(shè)置輪詢比率,循環(huán)調(diào)用節(jié)點
  • 缺點:同樣存在慢的提供者累積請求的問題。

加權(quán)輪詢過程過程中,如果某節(jié)點權(quán)重過大,會存在某段時間內(nèi)調(diào)用過于集中的問題。例如 ABC 三節(jié)點有如下權(quán)重:?{A: 3, B: 2, C: 1}?那么按照最原始的輪詢算法,調(diào)用過程將變成:?A A A B B C?

對此,Dubbo 借鑒 Nginx 的平滑加權(quán)輪詢算法,對此做了優(yōu)化,調(diào)用過程可抽象成下表:

輪前加和權(quán)重 本輪勝者 合計權(quán)重 輪后權(quán)重(勝者減去合計權(quán)重)
起始輪 \ \ A(0), B(0), C(0)
A(3), B(2), C(1) A 6 A(-3), B(2), C(1)
A(0), B(4), C(2) B 6 A(0), B(-2), C(2)
A(3), B(0), C(3) A 6 A(-3), B(0), C(3)
A(0), B(2), C(4) C 6 A(0), B(2), C(-2)
A(3), B(4), C(-1) B 6 A(3), B(-2), C(-1)
A(6), B(0), C(0) A 6 A(0), B(0), C(0)

我們發(fā)現(xiàn)經(jīng)過合計權(quán)重(3+2+1)輪次后,循環(huán)又回到了起點,整個過程中節(jié)點流量是平滑的,且哪怕在很短的時間周期內(nèi),概率都是按期望分布的。

如果用戶有加權(quán)輪詢的需求,可放心使用該算法。

LeastActive

  • 加權(quán)最少活躍調(diào)用優(yōu)先,活躍數(shù)越低,越優(yōu)先調(diào)用,相同活躍數(shù)的進行加權(quán)隨機。活躍數(shù)指調(diào)用前后計數(shù)差(針對特定提供者:請求發(fā)送數(shù) - 響應(yīng)返回數(shù)),表示特定提供者的任務(wù)堆積量,活躍數(shù)越低,代表該提供者處理能力越強。
  • 使慢的提供者收到更少請求,因為越慢的提供者的調(diào)用前后計數(shù)差會越大;相對的,處理能力越強的節(jié)點,處理更多的請求。

ShortestResponse

  • 加權(quán)最短響應(yīng)優(yōu)先,在最近一個滑動窗口中,響應(yīng)時間越短,越優(yōu)先調(diào)用。相同響應(yīng)時間的進行加權(quán)隨機。
  • 使得響應(yīng)時間越快的提供者,處理更多的請求。
  • 缺點:可能會造成流量過于集中于高性能節(jié)點的問題。

這里的響應(yīng)時間 = 某個提供者在窗口時間內(nèi)的平均響應(yīng)時間,窗口時間默認是 30s。

ConsistentHash

  • 一致性 Hash,相同參數(shù)的請求總是發(fā)到同一提供者。
  • 當(dāng)某一臺提供者掛時,原本發(fā)往該提供者的請求,基于虛擬節(jié)點,平攤到其它提供者,不會引起劇烈變動。
  • 算法參見:Consistent Hashing | WIKIPEDIA
  • 缺省只對第一個參數(shù) Hash,如果要修改,請配置 ?<dubbo:parameter key="hash.arguments" value="0,1" />?
  • 缺省用 160 份虛擬節(jié)點,如果要修改,請配置 ?<dubbo:parameter key="hash.nodes" value="320" />?

配置

服務(wù)端服務(wù)級別

<dubbo:service interface="..." loadbalance="roundrobin" />

客戶端服務(wù)級別

<dubbo:reference interface="..." loadbalance="roundrobin" />

服務(wù)端方法級別

<dubbo:service interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>

客戶端方法級別

<dubbo:reference interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號