Dubbo的負載均衡策略&容錯策略

dubbo的負載均衡策略

  • RandomLoadBalance 隨機調用負載均衡 默認方式
    該類實現了抽象的AbstractLoadBalance接口,重寫了doSelect方法,看方法的細節就是首先遍歷每個提供服務的機器,獲取每個服務的權重,然後累加權重值,判斷每個服務的提供者權重是否相同,如果每個調用者的權重不相同,並且每個權重大於0,那麼就會根據權重的總值生成一個隨機數,再用這個隨機數,根據調用者的數量每次減去調用者的權重,直到計算出當前的服務提供者隨機數小於0,就選擇那個提供者!另外,如果每個機器的權重的都相同,那麼權重就不會參與計算,直接選擇隨機算法生成的某一個選擇,完全隨機。可以看出,隨機調用法
    • RoundRobinLoadBlance 輪詢調用
      輪詢調用的過程主要是維護了局部變量的一個LinkdesHashMap(有順序的Map)去存儲調用者和權重值的對應關係,然後遍歷每個調用者,把調用者和當前大於0的權重值放進去,再累加權重值。還有一個全局變量的map,找到第一個服務調用者,首先是找到每個服務的key值和method,這裏可以理解爲標識第一個調用者的唯一key,然後再給它對應的值保證原子性的 1(AtomicPositiveInteger是原子的),再對這個值取模總權重,再每次對其權重值-1,知道它取模與總權重值等於0就選擇該調用者,可以稱之爲"降權取模"(只是一種的計算層面,而不是真正降權)。總結:輪詢調用並不是簡單的一個接着一個依次調用,它是根據權重的值進行循環的。
    • LeastActiveLoadBlance 最少活躍數調用法
      這個方法的主要作用根據服務的提供者的運行狀態去選擇服務器,主要的思路就是遍歷每個調用者,然後獲取每個服務器的運行狀態,如果當前運行的運行狀態小於最小的狀態-1,把它保存在leastIndexs中的第一個位置,並且認定所有的調用者權重都相同,然後直接返回那個調用者(這裏的邏輯是:找到最少活躍數(在代碼層反應就是:active的值))。如果計算出的權重值和最少的權重值相同,那麼把它保存在leastIndexs數組裏面,累加權重值,如果當前的權重值不等於初始值firstWeight,那麼就認定不是所有的調用者的權重不同。然後再遍歷lestIndexs,取權重累加值的隨機數生成權重偏移量,在累減它,到它小於0的時候返回那個調用者。如果這些都不符合,就從leastIndexs隨機選一個index,返回那個調用者!
    • ConsistentHashLoadBalance 一致性Hash算法
      doSelect方法進行選擇。一致性Hash負載均衡涉及到兩個主要的配置參數爲hash.arguments與hash.nodes:當進行調用時候根據調用方法的哪幾個參數生成key,並根據key來通過一致性hash算法來選擇調用節點。例如調用方法invoke(Strings1,Strings2);若hash.arguments爲1(默認值),則僅取invoke的參數1(s1)來生成hashCode。
      hash.nodes:節點的副本數。。
      dubbo的一致性哈希通過ConsistentHashLoadBalance類來實現。ConsistentHashLoadBalance內部定義ConsistentHashSelector類,最終通過該類進行結點選擇。ConsistentHashLoadBalance實現的doSelect方法來利用所創建的ConsistentHashSelector對象選擇結點。doSelect的實現如下。當調用該方法時,如果選擇器不存在則去創建。隨後通過ConsistentHashSelector的select方法選擇結點。ConsistentHashSelector在構造函數內部會創建replicaNumber個虛擬結點,並將這些虛擬結點存儲於TreeMap。隨後根據調用方法的參數來生成key,並在TreeMap中選擇一個結點進行調用。上述代碼中hash(byte[]digest,intnumber)方法用來生成hashCode。該函數將生成的結果轉換爲long類,這是因爲生成的結果是一個32位數,若用int保存可能會產生負數。而一致性hash生成的邏輯環其hashCode的範圍是在0-MAX_VALUE之間。因此爲正整數,所以這裏要強制轉換爲long類型,避免出現負數。進行節點選擇的方法爲select,最後通過sekectForKey方法來選擇結點。在進行選擇時候若HashCode直接與某個虛擬結點的key一樣,則直接返回該結點,如果hashCode落在某個節點上。若不在,找到一個最小上個的key所對應的結點。

變更負載均衡策略

  • xml配置
  • 註解方式
    @Reference中引用,然後註明loadblance="xx"

dubbo容錯策略 缺省模式爲failover

  • Failover Cluster:失敗重試
    當服務消費方調用服務提供者失敗後自動切換到其他服務提供者服務器進行重試。這通常用於讀操作或者具有冪等的寫操作,需要注意的是重試會帶來更長延遲。可通過 retries="2" 來設置重試次數(不含第一次)。
    接口級別配置重試次數方法 ,如上配置當服務消費方調用服務失敗後,會再重試兩次,也就是說最多會做三次調用,這裏的配置對該接口的所有方法生效。當然你也可以針對某個方法配置重試次數如下:


  • Failfast Cluster:快速失敗
    當服務消費方調用服務提供者失敗後,立即報錯,也就是隻調用一次。通常這種模式用於非冪等性的寫操作。
  • Failsafe Cluster:失敗安全
    當服務消費者調用服務出現異常時,直接忽略異常。這種模式通常用於寫入審計日誌等操作。
  • Failback Cluster:失敗自動恢復
    當服務消費端用服務出現異常後,在後臺記錄失敗的請求,並按照一定的策略後期再進行重試。這種模式通常用於消息通知操作。
  • Forking Cluster:並行調用
    當消費方調用一個接口方法後,Dubbo Client會並行調用多個服務提供者的服務,只要一個成功即返回。這種模式通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設置最大並行數。
  • Boadcast Cluster:廣播調用
    當消費者調用一個接口方法後,Dubbo Client會逐個調用所有服務提供者,任意一臺調用異常則這次調用就標誌失敗。這種模式通常用於通知所有提供者更新緩存或日誌等本地資源信息。

隨便寫點什麼,然後就發佈了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章