Dubbo負載均衡與集群容錯機制


1  Dubbo簡介

    Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。

    作為一個輕量級RPC框架,Dubbo的設計架構簡潔清晰,主要組件包括Provider(服務提供者),Consumer(服務消費者),Registry(注冊中心)三部分組成。此外還有用於服務監控的Monitor,它們之間的關系如下所示:

 

    在一個分布式系統中,為了做到系統的高可用,即服務宕機時不影響對外正常提供服務,需要組建負載集群,當集群中某一節點沒有及時返回數據時,需要有集群容錯(重試)機制。

2 Dubbo負載均衡

    在集群負載均衡時,Dubbo 提供了以下5種均衡策略,缺省為 random 隨機調用。

Random

    隨機調用

Random LoadBalance

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

RoundRobin LoadBalance

    輪循,按公約后的權重設置輪循比率。
    存在慢的提供者累積請求的問題,比如:第二台機器很慢,但沒掛,當請求調到第二台時就卡在那,久而久之,所有請求都卡在調到第二台上。

LeastActive LoadBalance

    最少活躍調用數,相同活躍數的隨機,活躍數指調用前后計數差。
    使慢的提供者收到更少請求,因為越慢的提供者的調用前后計數差會越大。

ConsistentHash LoadBalance

    一致性 Hash,相同參數的請求總是發到同一提供者。
    當某一台提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。

3 負載均衡配置

服務端服務級別

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

 

客戶端服務級別

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

 

服務端方法級別

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

 

客戶端方法級別

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

 

4 Dubbo集群容錯(重試機制)

    在集群調用失敗時,Dubbo 提供了多種容錯方案,缺省為 Failover 重試。


 

 

各節點關系:

    這里的 Invoker 是 Provider 的一個可調用 Service 的抽象,Invoker 封裝了 Provider 地址及 Service 接口信息

    Directory 代表多個 Invoker,可以把它看成 List ,但與 List 不同的是,它的值可能是動態變化的,比如注冊中心推送變更

    Cluster 將 Directory 中的多個 Invoker 偽裝成一個 Invoker,對上層透明,偽裝過程包含了容錯邏輯,調用失敗后,重試另一個

    Router 負責從多個 Invoker 中按路由規則選出子集,比如讀寫分離,應用隔離等

    LoadBalance 負責從多個 Invoker 中選出具體的一個用於本次調用,選的過程包含了負載均衡算法,調用失敗后,需要重選

5 重試模式及其特點

Failover Cluster(默認)

    失敗自動切換,當出現失敗,重試其它服務器 [1]。通常用於讀操作,但重試會帶來更長延遲。可通過 retries="2" 來設置重試次數(不含第一次)。

    重試次數配置如下:

<dubbo:service retries="2" />
 
        

<dubbo:reference retries="2" />
 
        

<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>

 

Failfast Cluster

    快速失敗,只發起一次調用,失敗立即報錯。通常用於非冪等性的寫操作,比如新增記錄。

Failsafe Cluster

    失敗安全,出現異常時,直接忽略。通常用於寫入審計日志等操作。

Failback Cluster

    失敗自動恢復,后台記錄失敗請求,定時重發。通常用於消息通知操作。

Forking Cluster

    並行調用多個服務器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設置最大並行數。

Broadcast Cluster

    廣播調用所有提供者,逐個調用,任意一台報錯則報錯 [2]。通常用於通知所有提供者更新緩存或日志等本地資源信息。

6 集群模式配置

    按照以下示例在服務提供方和消費方配置集群模式

<dubbo:service cluster="failsafe" />

<dubbo:reference cluster="failsafe" />


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM