集群容錯(cuò)和負(fù)載均衡
- Cluster封裝了集群的容錯(cuò)機(jī)制failover竟秫、failfast、failsafe跷乐、failback以及forking肥败。
- Directory管理集群中服務(wù)的List,根據(jù)注冊中心動態(tài)注冊而變化List愕提。Cluster通過獲取Directory拙吉,將List<Invoker>偽裝成一個(gè)Invoker抽象,這一過程對于調(diào)用者透明揪荣。
- Router負(fù)責(zé)按規(guī)則從多個(gè)Invoker中選出子集筷黔。通過Router實(shí)現(xiàn)應(yīng)用隔離、讀寫分離仗颈,即使部分服務(wù)掛掉也不會影響其它應(yīng)用佛舱。
- LoadBalance負(fù)責(zé)從步驟3中獲取的子集中選出具體要求執(zhí)行invoke的具體Invoker。選的過程中包含了負(fù)載均衡算法挨决。
容錯(cuò)機(jī)制分類
- Failover Cluster
失敗自動切換请祖,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器 [1]脖祈。通常用于讀操作肆捕,但重試會帶來更長延遲「歉撸可通過 retries="2"
來設(shè)置重試次數(shù)(不含第一次)慎陵。
重試次數(shù)配置如下:
<dubbo:service retries="2" />
或
<dubbo:reference retries="2" />
或
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
- Failfast Cluster
快速失敗,只發(fā)起一次調(diào)用喻奥,失敗立即報(bào)錯(cuò)席纽。通常用于非冪等性的寫操作,比如新增記錄撞蚕。
- Failsafe Cluster
失敗安全润梯,出現(xiàn)異常時(shí),直接忽略。通常用于寫入審計(jì)日志等操作纺铭。
- Failback Cluster
失敗自動恢復(fù)寇钉,后臺記錄失敗請求,定時(shí)重發(fā)舶赔。通常用于消息通知操作扫倡。
- Forking Cluster
并行調(diào)用多個(gè)服務(wù)器,只要一個(gè)成功即返回顿痪。通常用于實(shí)時(shí)性要求較高的讀操作镊辕,但需要浪費(fèi)更多服務(wù)資源油够∫舷可通過 forks="2"
來設(shè)置最大并行數(shù)。
- Broadcast Cluster
廣播調(diào)用所有提供者石咬,逐個(gè)調(diào)用揩悄,任意一臺報(bào)錯(cuò)則報(bào)錯(cuò) [2]。通常用于通知所有提供者更新緩存或日志等本地資源信息鬼悠。
如何配置
按照以下示例在服務(wù)提供方和消費(fèi)方配置集群模式
<dubbo:service cluster="failsafe" />
或
<dubbo:reference cluster="failsafe" />
負(fù)載均衡算法
-
Random LoadBalance
- 隨機(jī)删性,按權(quán)重設(shè)置隨機(jī)概率。
- 在一個(gè)截面上碰撞的概率高焕窝,但調(diào)用量越大分布越均勻蹬挺,而且按概率使用權(quán)重后也比較均勻,有利于動態(tài)調(diào)整提供者權(quán)重它掂。
-
RoundRobin LoadBalance
- 輪詢巴帮,按公約后的權(quán)重設(shè)置輪詢比率。
- 存在慢的提供者累積請求的問題虐秋,比如:第二臺機(jī)器很慢榕茧,但沒掛,當(dāng)請求調(diào)到第二臺時(shí)就卡在那客给,久而久之用押,所有請求都卡在調(diào)到第二臺上。
-
LeastActive LoadBalance
- 最少活躍調(diào)用數(shù)靶剑,相同活躍數(shù)的隨機(jī)蜻拨,活躍數(shù)指調(diào)用前后計(jì)數(shù)差。
- 使慢的提供者收到更少請求桩引,因?yàn)樵铰奶峁┱叩恼{(diào)用前后計(jì)數(shù)差會越大官觅。
-
ConsistentHash LoadBalance
- 一致性 Hash**,相同參數(shù)的請求總是發(fā)到同一提供者阐污。
- 當(dāng)某一臺提供者掛時(shí)休涤,原本發(fā)往該提供者的請求,基于虛擬節(jié)點(diǎn),平攤到其它提供者功氨,不會引起劇烈變動序苏。
- 算法參見:http://en.wikipedia.org/wiki/Consistent_hashing
- 缺省只對第一個(gè)參數(shù) Hash,如果要修改捷凄,請配置
<dubbo:parameter key="hash.arguments" value="0,1" />
- 缺省用 160 份虛擬節(jié)點(diǎn)忱详,如果要修改,請配置
<dubbo:parameter key="hash.nodes" value="320" />
如何配置
- 服務(wù)端服務(wù)級別
<dubbo:service interface="..." loadbalance="roundrobin" />
- 客戶端服務(wù)級別
<dubbo:reference interface="..." loadbalance="roundrobin" />
- 服務(wù)端方法級別
<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
- 客戶端方法級別
<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
只訂閱
在實(shí)際生產(chǎn)開發(fā)中會出現(xiàn)這樣的情況:大部分開發(fā)人員希望有一個(gè)提供所有穩(wěn)定服務(wù)的注冊中心跺涤,但又存在一些新的服務(wù)或者變更的服務(wù)需要開發(fā)聯(lián)調(diào)匈睁,對于這部分服務(wù)可以通過過直連提供者(點(diǎn)對點(diǎn)直連)。對于正在開發(fā)的服務(wù)可以只用只訂閱模式桶错,只訂閱服務(wù)航唆,而不注冊正在開發(fā)的服務(wù)。
直連提供者
配置優(yōu)先級 JVM > 文件映射 > XML配置
- XML配置
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />
- 通過-D參數(shù)指定
// 在 JVM 啟動參數(shù)中加入-D參數(shù)映射服務(wù)地址 [2]院刁,如:
java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890
- 通過文件映射
如果服務(wù)比較多糯钙,也可以用文件映射,用 -Ddubbo.resolve.file
指定映射文件路徑退腥,此配置優(yōu)先級高于 <dubbo:reference>
中的配置 [3]任岸,如:
java -Ddubbo.resolve.file=xxx.properties
然后在映射文件 xxx.properties
中加入配置,其中 key 為服務(wù)名狡刘,value 為服務(wù)提供者 URL:
com.alibaba.xxx.XxxService=dubbo://localhost:20880
只注冊
假設(shè)存在兩個(gè)鏡像環(huán)境享潜,兩個(gè)注冊中心,有一個(gè)服務(wù)只在一個(gè)注冊中心A完成部署嗅蔬,在另一個(gè)注冊中心B尚未完成部署剑按,且A、B的其它應(yīng)用都需要依賴此服務(wù)购城。這個(gè)時(shí)候可以讓服務(wù)提供者只在B注冊吕座,但是不從B做服務(wù)訂閱。
<!-- 禁用服務(wù)訂閱way1 -->
<dubbo:registry id="aRegistry" address="10.20.153.10:9090" />
<dubbo:registry id="bRegistry" address="10.20.141.150:9090" subscribe="false" />
<!-- 禁用服務(wù)訂閱way2 -->
<dubbo:registry id="aRegistry" address="10.20.153.10:9090" />
<dubbo:registry id="bRegistry" address="10.20.141.150:9090?subscribe=false" />