背景
最近接手了一個系統(tǒng)荣挨,其功能都是查詢男韧。查詢分了兩種方式,一種是公司集團提供的查詢能力默垄,支持全國各個省份的查詢此虑,但是業(yè)務(wù)高峰期時服務(wù)響應(yīng)比較慢;另外一種是各省的分公司都分別提供了對應(yīng)的查詢能力口锭,但是服務(wù)質(zhì)量相對較差朦前,業(yè)務(wù)高峰期服務(wù)超時較多介杆,而且分公司系統(tǒng)升級時也會影響服務(wù)質(zhì)量。為了提升服務(wù)查詢的成功率韭寸,可以將兩種查詢方式結(jié)合起來春哨。比較完備方案就是優(yōu)先使用各省分公司提供的服務(wù),當分公司的服務(wù)質(zhì)量下降后降級到公司集團對應(yīng)的服務(wù)恩伺。很早就聽過Hystrix赴背,用在現(xiàn)用系統(tǒng)服務(wù)質(zhì)量提升的改造上,再適合不過了晶渠。
Hystrix簡介
Hystrix是Netflix開源的一款容錯系統(tǒng)癞尚, 能幫助開發(fā)者碼出具備強大的容錯能力和魯棒性的程序!
Hystrix功能
1乱陡、對依賴的服務(wù)(HTTP調(diào)用浇揩、SOA服務(wù))進行保護, 并且把控住由于依賴服務(wù)所帶來的的延遲和失敗憨颠。
2胳徽、防止在一個復雜的分布式系統(tǒng)里出現(xiàn)級聯(lián)失效(cascading failures)。
3爽彤、快速失斞痢(Fail fast),并且快速恢復依賴服務(wù)适篙。
4往核、優(yōu)雅的降級。
5嚷节、實時的監(jiān)控和報警聂儒。
健康狀態(tài)系統(tǒng)
請求被阻塞系統(tǒng)
?任何的RPC都可能會面臨三種情況:成功、失敗硫痰、超時衩婚。如果一次用戶請求所依賴外部服務(wù)(A,H,I,P)有任何一個不可用,就有可能導致整個用戶請求被阻塞效斑》谴海考慮到應(yīng)用容器的線程數(shù)目基本都是固定的,當在高并發(fā)的情況下缓屠,某一外部依賴的服務(wù)超時阻塞奇昙,就有可能使得整個主線程池被占滿 線程池被占滿就會導致整個服務(wù)不可用,而依賴該服務(wù)的其他服務(wù)敌完,就又可能會重復產(chǎn)生上述問題储耐。因此整個系統(tǒng)就像雪崩一樣逐漸的擴散、坍塌蠢挡、崩潰了弧岳!
艙壁隔離模式(Bulkheads)
貨船為了進行防止漏水和火災的擴散, 將船的底部劃分成一個個的艙室, 這樣一個艙室進水不會導致整艘船沉沒业踏。
服務(wù)雪崩
隔離架構(gòu)
降級-觸發(fā)fallback
1禽炬、run()/construct方法拋出非HystrixBadRequestException異常
2、run()/construct()運行超時
3勤家、熔斷器啟動
4腹尖、線程池/信號量拒絕
隔離策略
線程池隔離:會帶來線程開銷
Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ThreadPoolTestGroup"))
? ? ? .andCommandKey(HystrixCommandKey.Factory.asKey(“testCommandKey"))//與其他命名的線程池天然隔離.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolTest"))
信號量隔離:服務(wù)的并發(fā)數(shù)大于信號量閾值時將進入fallback 采用資源計數(shù)法,TryableSemaphore
.andCommandPropertiesDefaults(// 配置信號量隔離? ? HystrixCommandProperties.Setter()
? ? ? .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
? ? .withExecutionIsolationSemaphoreMaxConcurrentRequests(3)
? ? ? ? // fallback(降級)調(diào)用最大的并發(fā)數(shù).withFallbackIsolationSemaphoreMaxConcurrentRequests(10))
熔斷器
熔斷相當于家里電壓過大電路的跳閘功能伐脖, 跳閘可以保護我們的電器热幔, 在代碼中類比就是將調(diào)用的服務(wù)直接給屏蔽了, 不再調(diào)用調(diào)用遠程服務(wù)器的服務(wù) 舉個栗子讼庇,配置熔斷策略為 當請求錯誤比例在5s內(nèi)>50%時绎巨, 該服務(wù)將進入熔斷狀態(tài)。
熔斷器默認工作時間,默認:5秒蠕啄, 熔斷器中斷請求5秒后會進入半打開狀態(tài), 放部分流量過去重試场勤。
熔斷器的開關(guān)能保證服務(wù)調(diào)用者在 調(diào)用異常服務(wù)時, 快速返回結(jié)果, fail fast or fallback static,避免大量的同步等待 并且熔斷器能在一段時間后 繼續(xù)偵測請求執(zhí)行結(jié)果, 提供恢復服務(wù)調(diào)用的可能。
請求結(jié)果cache
將一個請求結(jié)果緩存起來歼跟, 下一個具有相同key的請求 將直接從緩存中取出結(jié)果和媳,減少請求開銷。
?Hystrix設(shè)計點
資源隔離
熔斷器模式
命令模式
觀察者模式
RxJava
自助服務(wù)系統(tǒng)查詢改造方案
命令調(diào)用模式哈街,省端直連接口留瞳;降級調(diào)用模式,集團電商接口骚秦。
自助服務(wù)整合Hystrix后系統(tǒng)請求流程圖她倘。
參考鏈接
http://www.reibang.com/p/b9af028efebb
https://github.com/Netflix/Hystrix/wiki
https://github.com/Netflix/Hystrix/wiki/How-To-Use
https://segmentfault.com/a/1190000005988895
http://kriszhang.com/hystrix_defend_your_webapp
https://blog.51cto.com/snowtiger/2057092