Java程式設計解密-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” />
歡迎關注,歡迎留言探討。
1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加群。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加群。
5.群號 468947140,點選連結加入群聊【Java-BATJ企業級資深架構】:https://jq.qq.com/?_wv=1027&k=5FksT0r
6.阿里Java高階大牛直播講解知識點,分享知識,知識點都是各位老師多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!
相關文章
- dubbo容錯機制和負載均衡負載
- Dubbo學習筆記(四)叢集容錯與負載均衡筆記負載
- dubbo叢集和負載均衡負載
- Dubbo原始碼分析(八)叢集容錯機制原始碼
- 負載均衡叢集負載
- haproxy(單機)+mysql叢集負載均衡MySql負載
- Dubbo剖析-叢集容錯
- Dubbo示例——叢集容錯
- dubbo原始碼解析-叢集容錯架構設計原始碼架構
- Dubbo原始碼分析(四)Dubbo呼叫鏈-消費端(叢集容錯機制)原始碼
- kubernetes叢集內排程與負載均衡負載
- Java面向容錯程式設計之重試機制Java程式設計
- orleans叢集及負載均衡實現負載
- 叢集、負載均衡、分散式的區別與聯絡負載分散式
- 服務發現與負載均衡機制-Service負載
- 負載均衡 - MQTT Broker 叢集詳解(一)負載MQQT
- Haproxy+Keepalived高可用負載均衡叢集負載
- 解密負載均衡技術和負載均衡演算法解密負載演算法
- Dubbo原始碼分析-叢集容錯之Router原始碼
- Dapr + .NET Core實戰(十一)單機Dapr叢集負載均衡負載
- 叢集,lvs負載均衡的四種工作模式負載模式
- mariadb叢集與nginx負載均衡配置–centos7版本Nginx負載CentOS
- dubbo原始碼解析之負載均衡原始碼負載
- dubbo(三):負載均衡實現解析負載
- Linux環境搭建Nginx+Tomcat負載均衡叢集LinuxNginxTomcat負載
- docker初體驗:docker部署nginx負載均衡叢集DockerNginx負載
- LVS+Keepalive 實現負載均衡高可用叢集負載
- 淺談達夢DSC叢集以及負載均衡實現與驗證負載
- 深入剖析 RocketMQ 原始碼 - 負載均衡機制MQ原始碼負載
- HDFS 02 - HDFS 的機制:副本機制、機架感知機制、負載均衡機制負載
- centos7下配置nginx反向代理負載均衡叢集CentOSNginx負載
- 粘性會話負載均衡 - MQTT Broker 叢集詳解(二)會話負載MQQT
- Dubbo原始碼解析之負載均衡策略原始碼負載
- LNMP 分散式叢集(一):Nginx+PHP平臺搭建與負載均衡配置LNMP分散式NginxPHP負載
- Flink的狀態程式設計和容錯機制(四)程式設計
- 全域性負載均衡與CDN內容分發負載
- kubernetes實踐之十三: 負載均衡機制Ingress負載
- RabbitMQ(四):使用Docker構建RabbitMQ高可用負載均衡叢集MQDocker負載