Dubbo負載均衡

2021-10-01 19:46:20 字數 1344 閱讀 7467

dubbo中有四種lb的方式:隨機、輪詢、最少活躍和一致雜湊

介面loadbalance 的定義說明,loadbalance 的實現只是在乙個服務提供的呼叫者列表(invokers)中選出乙個呼叫者即可,預設的負載方式是隨機負載均衡(@spi(randomloadbalance.name)),我們也可以指定使用哪種負載均衡:

先統計所有提供者上該介面方法的權重總和,然後對這個總和隨機nextint一下,看生成的隨機數落到哪個段內,就調哪個提供者上的該服務。

如果該介面方法的所有提供者的權重一樣,則直接內部的序列計數器(sequences)+1然後對提供者的數量進行取模來決定呼叫哪個提供者上的服務

如果該介面方法的所有提供者的權重不一樣,則找到其中最大的權重,然後將內部的權重計數器(weightsequences)+1並對該最大權重數取模,得到乙個權重基數,然後再找出權重比權重基數大的提供者列表,最後通過內部的序列計數器(sequences)+1然後對這個提供者列表的數量進行取模,來輪詢。

當提供者的權重不一樣時,之所以使用權重基數的方式,是因為基數權重是會變的,它等於weightsequences這個原子類 對 最大權重取模的結果,並且每次都會進行自增。因此,權重基數會先變大後變小。在大於權重基數的提供者列表中進行輪詢,那麼權重大的提供者自然得到更多的輪詢機會。

每個介面和介面方法都對應乙個rpcstatus物件,記錄了他們的活躍數、失敗數等等相關統計資訊。

此種負載均衡方式:

活躍數就像併發量降級中的計數器一樣,開始呼叫時活躍數+1,呼叫結束時活躍數-1,所以活躍值越大,表明該提供者提供者的該介面方法耗時越長,而消費能力強的提供者介面往往活躍值很低。最少活躍負載均衡保證了「慢」提供者能接收到更少的提供者呼叫。

其實現方式就是:生成虛擬節點,使用treemap儲存,然後獲取第乙個節點進行呼叫

上述的四種負載均衡,除了一致性雜湊,其他三種都依賴了介面方法的權重統計,借助權重的不同,隨機負載均衡就能做到動態調整的效果,dubbo中的輪詢負載方式,也利用了權重,那麼有人會問,dubbo中的隨機和輪詢是不是差別不大?是的,筆者也這樣認為,相似的效果,也有著相似的缺點,dubbo中的隨機和輪詢負載都沒有考慮到提供者提供者消費服務的能力,如果相差很大,「慢」提供者有可能被「快」提供給者給拖垮,其根本原因也是這兩種負載均衡的加權因子考慮的不是服務耗時。最少活躍的負載均衡就很巧妙的解決了此問題,而且它不是直接通過統計服務呼叫的耗時,而是採用統計呼叫差(活躍數)。一致性雜湊特別適用於有快取的系統,這樣快取命中率會比較高。

一致性hash負載均衡

dubbo負載均衡

在集群負載均衡時,dubbo提供了多種均衡策略,預設為random隨機呼叫。random loadbalance 隨機,按權重設定隨機概率。在乙個截面上碰撞的概率高,但呼叫量越大分布越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。roundrobin loadbalance 輪循,...

dubbo負載均衡

負載均衡 在集群負載均衡時,dubbo 提供了多種均衡策略,預設為 random 隨機呼叫。負載均衡策略 random loadbalance 1 隨機,按權重設定隨機概率。2 在乙個截面上碰撞的概率高,但呼叫量越大分布越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。roundro...

Dubbo 負載均衡

負載均衡策略 dubbo內建了四種負載均衡策略 randomloadbalance 隨機負載均衡,預設的策略 roundrobinloadbalance 輪詢負載均衡 leastactiveloadbalance 最少活躍呼叫數 consistenhashloadbalance 一致性雜湊,相同引數...