dubbo負載均衡演算法及原始碼解析

2021-08-21 05:40:33 字數 2693 閱讀 4666

二 、最少活躍呼叫數負載均衡策略(leastactive loadbalance)

三 、輪詢負載均衡策略(roundrobin loadbalance)

四、隨機負載均衡策略(random loadbalance)

dubbo中的負載均衡策略有四種如下:隨機(random)、輪詢(roundrobin)、最少活躍呼叫數(leastactive)、一致性hash(consistenthash),預設配置預設為 random 隨機負載均衡策略

一、一致性hash負載均衡演算法介紹及原始碼實現解析(consistenthash loadbalance)

1.一致性hash演算法介紹

虛擬圓環:一致性雜湊將整個雜湊值空間組織成乙個虛擬的圓環。如假設某雜湊函式的值空間為0~2^32 -1(即:雜湊值為乙個32位無符號整形),

整個空間按照順時針方向組織,0和2^32 -1在零點出重合。

對映伺服器到虛擬圓環(虛擬)節點:將所有伺服器使用指定hash函式計算hash值,並且對映到虛擬圓環的對應位置,即:服務對應的節點;

定位資料訪問的伺服器:將資料key使用相同的hash函式計算出hash值,並確定此資料在hash環上的位置,從此位置沿環順時針尋找到的第乙個伺服器

節點,即為當前資料key要訪問的伺服器。

伺服器使用虛擬節點的目的:可以保證在伺服器數量變動的情況下,仍然使得資源能夠均勻分布(即:負載均衡)。

ketama_hash演算法的好處:解決hash值分布不均的問題。

經常使用treemap來表示hash環的原因:用treemap的時間複雜度是o(logn),相對效率比較高,且treemap使用了紅黑樹結構儲存實體物件。

2.一致性hash解決的問題

一致性雜湊演算法常用於負載均衡中要求資源被均勻的分布到所有節點上,並且對資源的請求能快速路由到對應的節點上.

相比普通的雜湊演算法採用簡單取模的方式,將快取伺服器進行雜湊;一致性雜湊演算法能有效降低伺服器個數變化對整體快取的影響。

memcache集群,要求儲存各種資料均勻的存到集群中的各個節點上,訪問這些資料時能快速的路由到集群中對應存放該資料的節點上;

並且要求增刪集群中節點對整個集群的影響很小,不至於有大的動盪造成整體負載的不穩定;

rpc過程中服務提供者做n個節點的集群部署,為了能在服務上維護一些業務狀態,希望同一種請求每次都落到同一臺服務上。

3.dubbo使用一致性hash演算法的特點

一致性hash負載均衡演算法,相同引數的請求總是傳送到同乙個服務提供者(在服務提供者列表不變的前提下)

當某一台提供者掛掉時,原本發往該提供者的請求,將基於虛擬節點,平攤到其他的提供者,不會引起劇烈變動。

預設情況下,一致性hash會使用160個虛擬節點構造一致性hash環,並且只使用對應方法第乙個引數的hash值作為

key去hash環上獲取對應的服務提供者物件(invoker),改變預設配置方式如下:

4.演算法重點原始碼解析(consistenthashloadbalance類 )

concurrentmap> selectors用於儲存每個 請求url(由dubbo配置中的inte***ce+group+versi

on+methodname組裝而成)與 一致性hash物件consistenthashselector(由服務提供者列表,相當於伺服器列表構造而成)的map對映(一致性

hash物件的構成具體見2)

構造一致性hash環時的重要屬性:treemap> virtualinvokers用於儲存一致性hash物件環上的虛擬節點,每個節點儲存

提供者url的hash值服務提供者物件(invoker)的對應關係

獲取服務提供者步驟:1、通過請求url獲取對應的一致性hash物件;2、通過請求引數的hash值在一致性hash環上面查詢對應的虛擬節點,獲取服務提

供者;此處利用了treemap.tailmap(key)返回 其鍵大於或等於 fromkey 的map集合的特性。

演算法的具體實現以及原始碼完整註解見consistenthashloadbalance類

二 、最少活躍呼叫數負載均衡策略(leastactive loadbalance)

1. 演算法描述

2.演算法重點原始碼解析 leastactiveloadbalance類

int active = rpcstatus.getstatus(invoker.geturl(),invocation.getmethodname()).getactive(); // 活躍數獲取當前服務提供者url+method對應的active數量。 rpcstatus 通過乙個concurrentmap> method_statistics記錄所有的服務提供者每個服務(用url+mothod 標識)的的rpcstatus,其中包括active(活躍數)、total(處理請求的總數)、failed(請求失敗數量)、以及各種情況的服務處理時間。

dubbo是如何記錄服務提供者各個服務url的active數量呢?

三 、輪詢負載均衡策略(roundrobin loadbalance)

1. 演算法描述

四、隨機負載均衡策略(random loadbalance)

1. 演算法描述

Dubbo原始碼學習 集群負載均衡演算法的實現

dubbo原始碼學習文章目錄 dubbo 的定位是分布式服務框架,為了避免單點壓力過大,服務的提供者通常部署多台,如何從服務提供者集群中選取乙個進行呼叫,就依賴於dubbo的負載均衡策略。dubbo 負載均衡策略提供下列四種方式 random loadbalance 隨機,按權重設定隨機概率。dub...

Dubbo篇 負載均衡策略原始碼分析

在進行消費端服務呼叫的時候,看到初始化了loadbalance,通過負載均衡獲取乙個可用的節點。loadbalance也是乙個擴充套件點,dubbo內建了4種負載均衡演算法,都繼承自abstractloadbalance,abstractloadbalance中實現通用邏輯,留乙個抽象方法dosel...

dubbo自定義負載均衡策略及相關原始碼解析

最近在研究即時訊息推送系統 im系統 的架構,自己用netty開發了基礎網路通訊部分,用來維護tcp連線,在客戶端上線時將使用者標識userid和路由資訊存在redis中,通過dubbo向上層模組提供訊息推送介面。在上層訊息 路由模組設計時,遇到了乙個問題,dubbo介面呼叫時要根據路由資訊中的ip...