Dubbo3 負(fù)載均衡

2022-03-30 15:54 更新

Dubbo 提供的集群負(fù)載均衡策略

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

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

可以自行擴(kuò)展負(fù)載均衡策略,參見:負(fù)載均衡擴(kuò)展

負(fù)載均衡策略

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

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

Random

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

RoundRobin

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

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

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

輪前加和權(quán)重 本輪勝者 合計(jì)權(quán)重 輪后權(quán)重(勝者減去合計(jì)權(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)過合計(jì)權(quán)重(3+2+1)輪次后,循環(huán)又回到了起點(diǎn),整個(gè)過程中節(jié)點(diǎn)流量是平滑的,且哪怕在很短的時(shí)間周期內(nèi),概率都是按期望分布的。

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

LeastActive

  • 加權(quán)最少活躍調(diào)用優(yōu)先,活躍數(shù)越低,越優(yōu)先調(diào)用,相同活躍數(shù)的進(jìn)行加權(quán)隨機(jī)?;钴S數(shù)指調(diào)用前后計(jì)數(shù)差(針對(duì)特定提供者:請(qǐng)求發(fā)送數(shù) - 響應(yīng)返回?cái)?shù)),表示特定提供者的任務(wù)堆積量,活躍數(shù)越低,代表該提供者處理能力越強(qiáng)。
  • 使慢的提供者收到更少請(qǐng)求,因?yàn)樵铰奶峁┱叩恼{(diào)用前后計(jì)數(shù)差會(huì)越大;相對(duì)的,處理能力越強(qiáng)的節(jié)點(diǎn),處理更多的請(qǐng)求。

ShortestResponse

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

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

ConsistentHash

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

配置

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

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

客戶端服務(wù)級(jí)別

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

服務(wù)端方法級(jí)別

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

客戶端方法級(jí)別

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)