Hystrix是什么?
Hystrix是Netflix開源庫,這是一個針對分布式系統的延遲和容錯庫。
Hystrix 供分布式系統使用,提供延遲和容錯功能,隔離遠程系統、訪問和第三方程序庫的訪問點,防止級聯失敗,保證復雜的分布系統在面臨不可避免的失敗時,仍能有其彈性。
Netflix稱,在分布式環境中,不可避免會造成一些服務的失敗。Hystrix 庫旨在控制分布式服務中提供更大容限和服務失敗之間的相互關系。Hystrix 通過隔離訪問遠程系統、服務和第三方庫的點,阻止級聯故障,從而使復雜的分布式系統更具彈性。
Hystrix是一個用于處理分布式系統的延遲和容錯的開源庫,Hystrix能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分布式系統的彈性。
簡單說,在日益龐大的微服務系統中,Hystrix的作用就是來避免當某個服務發生故障時,形成發散型的影響,導致越來越多的服務故障。
Hystrix有什么?
資源隔離
包括線程池隔離和信號量隔離,限制調用分布式服務的資源使用,某一個調用的服務出現問題不會影響其他服務調用。
Hystrix隔離模式–信號量模式
當 n 個并發請求去調用一個目標服務接口時,都要獲取一個信號量才能真正去調用目標服務接口,但信號量有限,默認是 10 個(通過maxConcurrentRequests參數配置),如果并發請求數多于信號量個數,就有線程需要進入隊列排隊,但排隊隊列也有上限,默認是 5,如果排隊隊列也滿,則必定有請求線程會走 fallback 流程,從而達到限流和防止雪崩的目的。
Hystrix隔離模式–線程池模式
當 n 個請求線程并發對某個接口請求調用時,會先從 hystrix 管理的線程池里面獲得一個線程,然后將參數傳遞給這個線程去執行真正調用。線程池的大小有限,默認是 10 個線程(maxConcurrentRequests參數配置),如果并發請求數多于線程池線程個數,就有線程需要進入隊列排隊,但排隊隊列也有上限,默認是 5,如果排隊隊列也滿,則必定有請求線程會走 fallback 流程。
線程池模式可以支持異步調用,支持超時調用,支持直接熔斷,存在線程切換,開銷大。
兩種模式的對比
通過二者的對比,我們可以發現信號量模式比較適用于一些業務邏輯比較復雜的訪問,而線程池的適用性比較普遍,特別是對外的服務訪問
降級機制
什么是降級?
當服務器壓力劇增的情況下,根據當前業務情況及流量對一些服務和頁面有策略的降級,以此釋放服務器資源以保證核心任務的正常運行。
降級機制有哪些?
超時降級、資源不足時(線程或信號量)降級,降級后可以配合降級接口返回托底數據。
服務融斷
服務熔斷是什么?
一般是指軟件系統中,由于某些原因使得服務出現了過載現象,為防止造成整個系統故障,從而采用的一種保護措施,所以很多地方把熔斷亦稱為過載保護。
為什么需要服務熔斷?
很多時候剛開始可能只是系統出現了局部的、小規模的故障,然而由于種種原因,故障影響的范圍越來越大,最終導致了全局性的后果。 適用場景:防止應用程序直接調用那些很可能會調用失敗的遠程服務或共享資源
緩存
緩存在高并發的環境下使用,能夠有效地減少服務器的壓力, 使用Hystrix返回結果緩存,后續請求可以直接調用緩存數據。
緩存的使用
開啟請求緩存:在實現HystrixCommand或HystrixObservableCommand時,通過重載getCacheKey()方法來開啟請求緩存
清理失效緩存功能:Hystrix中,可以通過HystrixRequestCache.clear()方法來進行緩存的清理,適用于對緩存數據進行更新的場景。