Hystrix

Hystrix是什麼

Hystrix是Netflix開源的一款針對分佈式系統的延遲和容錯庫,目的是用來隔離分佈式服務故障,它提供線程和信號量隔離,以減小服務之間資源競爭帶來的相互影響;提供優雅的降級機制;提供熔斷機制使得服務能夠快速失敗,而不是一直阻塞等待服務響應,並能從中快速恢復。Hystrix經過這些機制來阻止級聯失敗並保證系統彈性、可用。數據庫

                                      

                                                               圖-典型的分佈式服務實現編程

在如上圖典型的分佈式服務中,多個Http服務會共享一個線程池,假設一個Http服務訪問的數據庫響應很是慢,這將會形成服務響應時間很是慢,大多數線程阻塞等待數據響應返回,致使整個Tomcat線程池都被該服務佔用,甚至拖垮整個Tomcat,所以若是咱們能把不一樣Http服務隔離到不一樣的線程池,則某個Http服務的線程池滿了也不會對其它服務形成災難性故障,這就須要線程隔離或者信號量隔離來實現了。使用線程隔離或者信號隔離的目的是爲不一樣的服務分配必定的資源,當本身的資源用完,直接返回失敗而不是佔用別人的資源。同時咱們依賴的服務訪問超時時,要提供降級策略,好比返回託底策略阻止級聯故障,當由於一些故障使得服務可用率降低時,要能及時熔斷,一是快速失敗,而是能夠保護遠程分佈式服務緩存

Hystrix能作什麼

限制調用布式服務的資源使用,經過線程池隔離和信號量隔離實現;網絡

提供優雅的降級策略:超時降級、資源不足時(線程或信號量)降級,降級後能夠配合降級接口返回託底數據;併發

提供熔斷器實現,當失敗率達到閾值自動觸發降級,熔斷器觸發的快速失敗會進行快速恢復異步

提供請求緩存請求合併實現。分佈式

線程隔離

Hystrix經過命令模式,將每一個類型的業務請求封裝成對應的命令請求。在應用Hystrix時,首先須要把服務封裝成HystrixCommand,即命令模式實現,而後就能夠經過同步/異步/響應式模式來調用服務。異步編程

執行依賴代碼的線程與請求線程(好比Tomcat線程)分離,請求線程能夠自由控制離開的時間,這也是咱們一般說的異步編程,Hystrix是結合RxJava來實現的異步編程。經過設置線程池大小來控制併發訪問量,當線程飽和的時候能夠拒絕服務,防止依賴問題擴散。ui

                                  

                                                                  圖-隔離示例spa

信號量隔離只是限制了總的併發數,服務使用主線程進行同步調用,即沒有線程池,所以若是隻是限制某個服務的總併發調用量或者調用的服務不涉及遠程調用的話,可使用輕量級的信號量來實現。線程池隔離和信號量隔離的主要區別:線程池方式下業務請求線程和執行依賴的服務的線程不是同一個線程;信號量方式下業務請求線程和執行依賴服務的線程是同一個線程

                        

                                               圖-線程隔離與信號量隔離對比示意圖

熔斷器(Circuit Breaker)

Hystrix在運行過程當中會向每一個commandKey對應的熔斷器報告成功、失敗、超時和拒絕的狀態,熔斷器維護計算統計的數據,根據這些統計的信息來肯定熔斷器是否打開。若是打開,後續的請求都會被截斷。而後會隔一段時間默認是5s,嘗試半開,放入一部分流量請求進來,至關於對依賴服務進行一次健康檢查,若是恢復,熔斷器關閉,隨後徹底恢復調用,以下圖所示。熔斷後會自動降級處理

                                

                                                        圖-熔斷示意圖

回退降級

所謂降級,就是指在在Hystrix執行非核心鏈路功能失敗的狀況下,咱們如何處理,好比咱們返回默認值等 。降級的最終目的是保證核心服務可用,即便是有損的,並且有的服務是沒法降級的(如加入購物車、結算),這時程序就要將錯誤返回給調用者。 

結果cache

hystrix支持將一個請求結果緩存起來,下一個具備相同key的請求將直接從緩存中取出結果,減小請求開銷。要使用hystrix cache功能,第一個要求是重寫getCacheKey(),用來構造cache key;第二個要求是構建context,若是請求B要用到請求A的結果緩存,A和B必須同處一個context。經過HystrixRequestContext.initializeContext()context.shutdown()能夠構建一個context,這兩條語句間的全部請求都處於同一個context。

合併請求collapsing

Hystrix支持N個請求自動合併爲一個請求,這個功能在有網絡交互的場景下尤爲有用,好比每一個請求都要網絡訪問遠程資源,若是把請求合併爲一個,將使屢次網絡交互變成一次,極大節省開銷。重要一點,兩個請求能自動合併的前提是二者足夠「近」,即二者啓動執行的間隔時長要足夠小,默認爲10ms,即超過10ms將不自動合併。

參考連接

簡書-Hystrix技術解析

簡書-Hystrix使用入門手冊(中文)

相關文章
相關標籤/搜索