【趕快收藏】Hystrix實戰,優雅提升系統的魯棒性
背景
最近接手了一個系統,其功能都是查詢。查詢分了兩種方式,一種是公司集團提供的查詢能力,支援全國各個省份的查詢,但是業務高峰期時服務響應比較慢;另外一種是各省的分公司都分別提供了對應的查詢能力,但是服務質量相對較差,業務高峰期服務超時較多,而且分公司系統升級時也會影響服務質量。為了提升服務查詢的成功率,可以將兩種查詢方式結合起來。比較完備方案就是優先使用各省分公司提供的服務,當分公司的服務質量下降後降級到公司集團對應的服務。很早就聽過Hystrix,用在現用系統服務質量提升的改造上,再適合不過了。
Hystrix簡介
Hystrix是Netflix開源的一款容錯系統, 能幫助開發者碼出具備強大的容錯能力和魯棒性的程式!
Hystrix功能
1、對依賴的服務(HTTP呼叫、SOA服務)進行保護, 並且把控住由於依賴服務所帶來的的延遲和失敗。
2、防止在一個複雜的分散式系統裡出現級聯失效(cascading failures)。
3、快速失敗(Fail fast),並且快速恢復依賴服務。
4、優雅的降級。
5、實時的監控和報警。
健康狀態系統
請求被阻塞系統
任何的RPC都可能會面臨三種情況:成功、失敗、超時。如果一次使用者請求所依賴外部服務(A,H,I,P)有任何一個不可用,就有可能導致整個使用者請求被阻塞。考慮到應用容器的執行緒數目基本都是固定的,當在高併發的情況下,某一外部依賴的服務超時阻塞,就有可能使得整個主執行緒池被佔滿 執行緒池被佔滿就會導致整個服務不可用,而依賴該服務的其他服務,就又可能會重複產生上述問題。因此整個系統就像雪崩一樣逐漸的擴散、坍塌、崩潰了!
艙壁隔離模式(Bulkheads)
貨船為了進行防止漏水和火災的擴散, 將船的底部劃分成一個個的艙室, 這樣一個艙室進水不會導致整艘船沉沒。
服務雪崩
隔離架構
降級-觸發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"))
訊號量隔離:服務的併發數大於訊號量閾值時將進入fallback 採用資源計數法,TryableSemaphore
.andCommandPropertiesDefaults( // 配置訊號量隔離 HystrixCommandProperties.Setter() .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE) .withExecutionIsolationSemaphoreMaxConcurrentRequests(3) // fallback(降級)呼叫最大的併發數 .withFallbackIsolationSemaphoreMaxConcurrentRequests(10))
熔斷器
熔斷相當於家裡電壓過大電路的跳閘功能, 跳閘可以保護我們的電器, 在程式碼中類比就是將呼叫的服務直接給遮蔽了, 不再呼叫呼叫遠端伺服器的服務 舉個栗子,配置熔斷策略為 當請求錯誤比例在5s內>50%時, 該服務將進入熔斷狀態。
熔斷器預設工作時間,預設:5秒, 熔斷器中斷請求5秒後會進入半開啟狀態, 放部分流量過去重試。
熔斷器的開關能保證服務呼叫者在 呼叫異常服務時, 快速返回結果, fail fast or fallback static,避免大量的同步等待 並且熔斷器能在一段時間後 繼續偵測請求執行結果, 提供恢復服務呼叫的可能。
請求結果cache
將一個請求結果快取起來, 下一個具有相同key的請求 將直接從快取中取出結果,減少請求開銷。
Hystrix設計點
- 資源隔離
- 熔斷器模式
- 命令模式
- 觀察者模式
- RxJava
自助服務系統查詢改造方案
命令呼叫模式,省端直連線口;降級呼叫模式,集團電商介面。
自助服務整合Hystrix後系統請求流程圖。
參考連結
http://www.jianshu.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/205