Java編程解密-Dubbo負載均衡與集羣容錯機制

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

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

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

2 Dubbo負載均衡 在集羣負載均衡時,Dubbo 提供瞭如下5種均衡策略,缺省爲 random 隨機調用。服務器

Random架構

隨機調用負載均衡

Random LoadBalance框架

隨機,按權重設置隨機機率。dom

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

RoundRobin LoadBalanceide

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

存在慢的提供者累積請求的問題,好比:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,長此以往,全部請求都卡在調到第二臺上。

LeastActive LoadBalance

最少活躍調用數,相同活躍數的隨機,活躍數指調用先後計數差。

使慢的提供者收到更少請求,由於越慢的提供者的調用先後計數差會越大。

ConsistentHash LoadBalance

一致性 Hash,相同參數的請求老是發到同一提供者。

當某一臺提供者掛時,本來發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引發劇烈變更。

3 負載均衡配置 服務端服務級別

interface="..." loadbalance="roundrobin" />;

客戶端服務級別

interface="..." loadbalance="roundrobin" />

服務端方法級別

dubbo:serviceinterface="..."

<dubbo:methodname="..." loadbalance="roundrobin"/>

dubbo:service>

客戶端方法級別

dubbo:referenceinterface="..."

<dubbo:methodname="..." 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:serviceretries="2" />

<dubbo:referenceretries="2" />

dubbo:reference

<dubbo:methodname="findFoo" retries="2" />

dubbo:reference>

Failfast Cluster

快速失敗,只發起一次調用,失敗當即報錯。一般用於非冪等性的寫操做,好比新增記錄。

Failsafe Cluster

失敗安全,出現異常時,直接忽略。一般用於寫入審計日誌等操做。

Failback Cluster

失敗自動恢復,後臺記錄失敗請求,定時重發。一般用於消息通知操做。

Forking Cluster

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

Broadcast Cluster

廣播調用全部提供者,逐個調用,任意一臺報錯則報錯 [2]。一般用於通知全部提供者更新緩存或日誌等本地資源信息。

6 集羣模式配置 按照如下示例在服務提供方和消費方配置集羣模式

<dubbo:servicecluster="failsafe" />

<dubbo:referencecluster="failsafe" />

歡迎關注,歡迎留言探討。

相關文章
相關標籤/搜索