天天看點

dubbo負載均衡政策

概述

    本篇文章主要是想講解清楚dubbo的負載均衡政策,其中文章的内容部分共享自網絡,部分來自自己的整理,目的還是跟以往一樣,将一個簡單的問題講解清楚。

負載均衡政策及優缺點

    Dubbo 負載均衡政策提供下列四種方式:

Random LoadBalance 随機

,按權重設定随機機率。

Dubbo的預設負載均衡政策

        在一個截面上碰撞的機率高,但調用量越大分布越均勻,而且按機率使用權重後也比較均勻,有利于動态調整提供者權重。

RoundRobin LoadBalance 輪循

,按公約後的權重設定輪循比率。

        存在慢的提供者累積請求問題,比如:第二台機器很慢,但沒挂,當請求調到第二台時就卡在那,久而久之,所有請求都卡在調到第二台上。

LeastActive LoadBalance 最少活躍調用數

,相同活躍數的随機,活躍數指調用前後計數差。

        使慢的提供者收到更少請求,因為越慢的提供者的調用前後計數差會越大。

ConsistentHash LoadBalance 一緻性Hash

,相同參數的請求總是發到同一提供者。

        當某一台提供者挂時,原本發往該提供者的請求,基于虛拟節點,平攤到其它提供者,不會引起劇烈變動。

dubbo負載均衡政策

負載均衡類圖

Random負載均衡政策

    負載均衡政策也分為權重相同和權重不相同兩種情況進行處理,整個代碼處理是先計算各個invoker(provider)的權重,判定權重是否相等以及總權重是多少。

    如果權重不相等,那麼我們就對總權重進行随機取值(通過random.nextInt實作),然後周遊invokers将随機的權重值減去每個invoker的權重,如果得出的結果為負數說明由該invoker提供服務。

    如果權重相等,那麼就通過random.nextInt()在所有的invoker當中随機選擇一個invoker就可以了。

dubbo負載均衡政策

随機負載均衡政策

RoundRobin負載均衡政策

    輪詢負載均衡政策分為權重相同和權重不同兩種政策,整個代碼周遊所有invoker的權重求出最小最大權重以及權重之和。

    針對每個方法,我們會維持一個sequences對象,這個其實就是一個atomic類的整數類型計數。每次進來的時候會循環遞增。

    針對權重不相同的情況,我們外層循環按照最大權重去循環,内層循環是invoker的個數,這裡其實我們要記住由于我們總權重是把所有invoker的權重相加,而循環是拿最大權重*所有invoker的個數,是以後者肯定大于前者。

    權重不同的舉個例子,假設invoker A權重400,invoker B權重為100,invoker C權重為100,這個時候假設mod為300,那麼在周遊A,B,C過程中我們會将mod進行遞減,invoker A、B、C遞減,最後發現invoker剩餘300,最後傳回invoker A,這裡的關鍵是遞減那部分邏輯很重要。

    針對權重相同的情況其實就是我們常見的i++%invoker個數。

dubbo負載均衡政策

輪詢負載均衡政策

LeastActive負載均衡政策

    最小active的負載均衡政策也分為有權重和沒有權重兩種情況,整體思路是每次在所有invoker中擷取active最低的個數,然後後面的invoker選擇就在最低active的叢集當中選擇。

    有權重和沒有權重的最低active選擇都是基于上面說的數組,舉個例子,假如現在有4個invoker,然後具備最低active的invoker有2個,那麼後面我們就在最低active的2個invoker進行選擇。

    帶權重的選擇就是根據最低active的權重和随機生成一個随機權重,然後周遊最低active的數目,每次減去invoker的權重,當權重為負數的時候就以該invoker提供服務。

    不帶權重的選擇就是根據最低active的數量通過random.nextInt方式随機傳回一個invoker就可以。

dubbo負載均衡政策

ConsistentHash負載均衡政策

    一緻性hash的負載均衡政策其實就跟一緻性hash的原理一樣,主要也是分成生成虛拟節點和選擇節點提供服務。

    首先我們先生成invoker也就是服務接口對應的selector,原則是沒有就生成一個。每個invoker虛拟節點的生成的原則很簡單:會根據虛拟節點設定的個數/4進行外層循環,以4進行内層循環生成。

    其次我們提取請求中攜帶的參數(因為我們規定了按照哪些參數進行hash)生成hash值,然後選擇對應的虛拟節點(如果存在這個hash值),或者選擇大于該值的第一個虛拟節點的值,最後去選擇對應的invoker。

dubbo負載均衡政策

選擇hash過程

dubbo負載均衡政策

生成虛拟節點

dubbo負載均衡政策

根據參數選擇節點

負載均衡之源碼debug

    1、先本地啟動zookeeper的注冊中心   

    2、直接複用dubbo的源碼,我們需要修改provider裡面的properties然後啟動多個provider,隻有多個provider才能調試負載均衡政策。

    3、consumer直接進行debug跟蹤即可。

dubbo負載均衡政策

debug方案

繼續閱讀