【Spring Cloud系列】Hystrix應(yīng)用詳解
一、概述
在一個分布式系統(tǒng)中,每個服務(wù)都可能會調(diào)用其它的服務(wù)器,服務(wù)之間是相互調(diào)用相互依賴。假如微服務(wù)A調(diào)用微服務(wù)B和微服務(wù)C,微服務(wù)B和微服務(wù)C又調(diào)用其他的微服務(wù)。這就是構(gòu)成所謂“扇出”。
如果扇出的鏈路上某個微服務(wù)的調(diào)用響應(yīng)的時間過長或者不可用,對微服A的調(diào)用就會占用越來越多的系統(tǒng)資源,進而引起系統(tǒng)崩潰,即"雪崩效應(yīng)"。
對于高流量的應(yīng)用來說,單一的后端依賴可能會導(dǎo)致所有的服務(wù)器上的所有資源都在幾秒鐘內(nèi)飽和。比失敗更糟糕的是,這些應(yīng)用程序還可能導(dǎo)致服務(wù)之間的延遲增加,備份隊列,線程和其他系統(tǒng)資源緊張,導(dǎo)致整個系統(tǒng)發(fā)生更多的級聯(lián)故障。這些都表示需要對故障和延遲進行隔離和管理,以便單個依賴關(guān)系的失敗,不能取消整個應(yīng)用程序或系統(tǒng)。
所以,通常當你發(fā)現(xiàn)一個模塊下的某個實例失敗后,這時候這個模塊依然還會接收流量,然后這個有問題的模塊還調(diào)用了其他的模塊,這樣就會發(fā)生級聯(lián)故障,或者叫雪崩。
為應(yīng)對微服務(wù)器系統(tǒng)出現(xiàn)“雪崩”事故,使用微服務(wù)Hystrix能避免級聯(lián)故障,以提高分布式系統(tǒng)的彈性。
二、什么是Hystix
Hystrix是一個用于處理分布式系統(tǒng)的延遲和容錯的開源庫,可以保證一個服務(wù)出現(xiàn)故障時,不會導(dǎo)致整個系統(tǒng)出現(xiàn)雪崩效應(yīng),以提高分布式系統(tǒng)彈性;
作為“斷路器”,在一個服務(wù)出現(xiàn)故障時,可以通過短路器監(jiān)控,返回一個可以處理的響應(yīng)結(jié)果,保證服務(wù)調(diào)用線程不會長時間被占用,避免故障蔓延。
三、Hystrix作用
- 對調(diào)用其他服務(wù)造成的異常和超時提供保護和控制。
- 在復(fù)雜的分布式系統(tǒng)中防止級聯(lián)失敗。
- 快速失敗和迅速恢復(fù)。
- 當必要時fallback和優(yōu)雅的降級。
- 提供實施監(jiān)控,警告和可選擇的控制。
四、Hystrix設(shè)計原則
- 防止單個依賴耗盡容器內(nèi)所有用戶線程
- 降低系統(tǒng)負載,對無法及時處理的請求快速失?。╢ail fast)而不是排隊
- 提供失敗回退,以在必要時讓失效對用戶透明化
- 使用隔離機制降低依賴服務(wù)對整個系統(tǒng)的影響
- 針對系統(tǒng)服務(wù)的度量、監(jiān)控和報警,提供優(yōu)化以滿足近實時性的要求
- 在 Hystrix 絕大部分需要動態(tài)調(diào)整配置并快速部署到所有應(yīng)用方面,提供優(yōu)化以滿足快速恢復(fù)的要求
- 能保護應(yīng)用不受依賴服務(wù)的整個執(zhí)行過程中失敗的影響,而不僅僅是網(wǎng)絡(luò)請求
五、Hystrix實現(xiàn)原理
5.1 隔離
Hystrix的隔離模式有兩種分別是:信號量模式和線程池模式。
信號量不支持超時,當被調(diào)服務(wù)發(fā)生問題時,有少部分用戶會長時間無法得到響應(yīng)。另外使用線程池模式無法獲取傳遞Header。
-
信號量和線程池有如下區(qū)別:
線程切換 支持異步 支持超時 支持熔斷 開銷大小 支持限量 信號量 否 否 否 是 小 是 線程池 是 是 是 是 大 是 -
信號量隔離
信號量的使用如圖(信號量示意圖),當n個并發(fā)請求去調(diào)用一個目標服務(wù)接口時,都要獲取一個信號量才能真正去調(diào)用目標服務(wù)接口,但信號量有限,默認是10個,可以使用maxConcurrentRequests參數(shù)配置,如果并發(fā)請求數(shù)多于信號量個數(shù),就有線程需要進入隊列排隊,但是排隊隊列也有上限,默認是5,如果排隊隊列也滿,則必定有請求線程會fallback流程,從而達到限流和防止雪崩的目的。
信號量模式從始至終都只有請求線程自身,是同步調(diào)用模式,不支持超時調(diào)用,不支持直接熔斷,由于沒有線程的切換,開銷非常小。
-
線程池隔離
線程池的使用示意圖如下圖所示,當n個請求線程并發(fā)對某個接口請求調(diào)用時,會先從hystrix管理的線程池里面獲得一個線程,然后將參數(shù)傳遞給這個線程去執(zhí)行真正調(diào)用。線程池的大小有限,默認是10個線程,可以使用maxConcurrentRequests參數(shù)配置,如果并發(fā)請求數(shù)多于線程池線程個數(shù),就有線程需要進入隊列排隊,但排隊隊列也有上限,默認是 5,如果排隊隊列也滿,則必定有請求線程會走fallback流程。
線程池模式可以支持異步調(diào)用,支持超時調(diào)用,支持直接熔斷,存在線程切換,開銷大
-
線程池隔離優(yōu)點:
- 使用線程池隔離可以完全隔離第三方應(yīng)用,請求線程可以快速放回。
- 請求線程可以繼續(xù)接受新的請求,如果出現(xiàn)問題線程池隔離是獨立的不會影響其他應(yīng)用
- 當失敗的應(yīng)用再次變得可用時,線程池將清理并可立即恢復(fù),而不需要一個長時間的恢復(fù)。
- 獨立的線程池提高了并發(fā)性。
盡管線程池隔離是由一個單獨的線程提供,客戶端代碼(異常方法里面的請求)應(yīng)該也 有超時機制,不能讓響應(yīng)的線程無限期等待,應(yīng)該適時去中斷它,阻止 Hystrix 線程池的飽和。
線程池隔離缺點:
線程池隔離的主要缺點是它們增加計算開銷(CPU)。每個命令的執(zhí)行涉及到排隊、調(diào)度和上 下文切換都是在一個單獨的線程上運行的。
-
應(yīng)用場景:
線程池隔離:第三方應(yīng)用或者接口和并發(fā)量大。
信號量隔離:內(nèi)部應(yīng)用或者中間件(redis)和 并發(fā)需求不大
5.2 熔斷
熔斷這一概念來源于電子工程中的斷路器(Circuit Breaker)。在互聯(lián)網(wǎng)系統(tǒng)中,當下游服務(wù)因訪問壓力過大而響應(yīng)變慢或失敗,上游服務(wù)為了保護系統(tǒng)整體的可用性,可以暫時切斷對下游服務(wù)的調(diào)用。
服務(wù)熔斷指軟件系統(tǒng)中,由于某些原因使得服務(wù)出現(xiàn)了過載現(xiàn)象,為防止造成整個系統(tǒng)故障,從而采用的一種保護措施,所以很多地方把熔斷亦稱為過載保護。很多時候剛開始可能只是系統(tǒng)出現(xiàn)了局部的、小規(guī)模的故障,然而由于種種原因,故障影響的范圍越來越大,最終導(dǎo)致了全局性的后果。
-
基于自反饋調(diào)節(jié)熔斷狀態(tài)的算法原理
熔斷器來源電子工程中的保險絲,一般在所有的家電系統(tǒng)連接外部供電的線路中間都會加一個保險絲,當外部電壓過高,達到保險絲的熔點時候,保險絲就會被熔斷,從而可以切斷家電系統(tǒng)與外部電路的聯(lián)通,進而保障家電系統(tǒng)不會因為電壓過高而損壞。
Hystrix提供的熔斷器就有類似功能,當在一定時間段內(nèi)服務(wù)調(diào)用方調(diào)用服務(wù)提供方的服務(wù)的次數(shù)達到設(shè)定的閾值,并且出錯的次數(shù)也達到設(shè)置的出錯閾值,就會進行服務(wù)降級,讓服務(wù)調(diào)用方之間執(zhí)行本地設(shè)置的降級策略,而不再發(fā)起遠程調(diào)用。但是Hystrix提供的熔斷器具有自我反饋,自我恢復(fù)的功能,Hystrix會根據(jù)調(diào)用接口的情況,讓熔斷器在closed,open,half-open三種狀態(tài)之間自動切換。
open狀態(tài):說明打開熔斷,也就是服務(wù)調(diào)用方執(zhí)行本地降級策略,不進行遠程調(diào)用。
closed狀態(tài):說明關(guān)閉了熔斷,這時候服務(wù)調(diào)用方直接發(fā)起遠程調(diào)用。
half-open狀態(tài):則是一個中間狀態(tài),當熔斷器處于這種狀態(tài)時候,直接發(fā)起遠程調(diào)用。
-
三種狀態(tài)的轉(zhuǎn)換
- closed->open:正常情況下熔斷器為closed狀態(tài),當訪問同一個接口次數(shù)超過設(shè)定閾值并且錯誤比例超過設(shè)置錯誤閾值時候,就會打開熔斷機制,這時候熔斷器狀態(tài)從closed->open。
- open->half-open:當服務(wù)接口對應(yīng)的熔斷器狀態(tài)為open狀態(tài)時候,所有服務(wù)調(diào)用方調(diào)用該服務(wù)方法時候都是執(zhí)行本地降級方法,那么什么時候才會恢復(fù)到遠程調(diào)用那?Hystrix提供了一種測試策略,也就是設(shè)置了一個時間窗口,從熔斷器狀態(tài)變?yōu)閛pen狀態(tài)開始的一個時間窗口內(nèi),調(diào)用該服務(wù)接口時候都委托服務(wù)降級方法進行執(zhí)行。如果時間超過了時間窗口,則把熔斷狀態(tài)從open->half-open,這時候服務(wù)調(diào)用方調(diào)用服務(wù)接口時候,就可以發(fā)起遠程調(diào)用而不再使用本地降級接口,如果發(fā)起遠程調(diào)用還是失敗,則重新設(shè)置熔斷器狀態(tài)為open狀態(tài),從新記錄時間窗口開始時間。
- half-open->closed: 當熔斷器狀態(tài)為half-open,這時候服務(wù)調(diào)用方調(diào)用服務(wù)接口時候,就可以發(fā)起遠程調(diào)用而不再使用本地降級接口,如果發(fā)起遠程調(diào)用成功,則重新設(shè)置熔斷器狀態(tài)為closed狀態(tài)。
系統(tǒng)設(shè)計時候要使用一定的熔斷策略,來保證當服務(wù)提供方服務(wù)出現(xiàn)異常訪問時,能及時截斷訪問里量,減少不必要的宕機達到服務(wù)的高可用,Hystrix作為熔斷器組件使用范圍還是很廣泛。
5.3 降級
服務(wù)降級是指當服務(wù)器壓力劇增的情況下,為了預(yù)防某些功能(業(yè)務(wù)場景)出現(xiàn)負荷過載或者響應(yīng)慢的情況,在其內(nèi)部暫時舍棄對一些非核心接口和服務(wù)請求,而直接返回一個提前準備好的fallback(退路)錯誤處理信息。這樣雖然提供的是一個有損的服務(wù),但釋放了服務(wù)器資源以保證核心業(yè)務(wù)正常運作或高效運作,保證了整個系統(tǒng)的穩(wěn)定性和可用性。其實盡可能的把系統(tǒng)資源讓給優(yōu)先級高的服務(wù)。
資源有限,而請求是無限的。如果在并發(fā)高峰期,不做服務(wù)降級處理,一方面肯定會影響整體服務(wù)的性能,嚴重的話可能會導(dǎo)致宕機某些重要的服務(wù)不可用。所以,一般在高峰期,為了保證核心功能服務(wù)的可用性,都要對某些服務(wù)降級處理。比如當雙 11 活動時,把交易無關(guān)的服務(wù)統(tǒng)統(tǒng)降級,如查看快遞單,查看歷史訂單等等。
-
服務(wù)降級主要用于什么場景呢
當整個微服務(wù)架構(gòu)整體的負載超出了預(yù)設(shè)的上限閾值或即將到來的流量預(yù)計將會超過預(yù)設(shè)的閾值時,為了保證重要或基本的服務(wù)能正常運行,可以將一些不重要或不緊急的服務(wù)或任務(wù)進行服務(wù)的延遲使用 或暫停使用。
降級的方式可以根據(jù)業(yè)務(wù)來,可以延遲服務(wù),比如延遲給用戶增加積分,只是放到一個緩存中,等服務(wù)平穩(wěn)之后再執(zhí)行;或者在粒度范圍內(nèi)關(guān)閉服務(wù)。 -
實現(xiàn)服務(wù)降級需要考慮幾個問題
- 那些服務(wù)是核心服務(wù),哪些服務(wù)是非核心服務(wù)
- 那些服務(wù)可以支持降級,那些服務(wù)不能支持降級,降級策略是什么
- 除服務(wù)降級之外是否存在更復(fù)雜的業(yè)務(wù)放通場景,策略是什么?
-
降級分類
- 超時降級:主要配置好超時時間和超時重試次數(shù)和機制,并使用異步機制探測回復(fù)情況;
- 失敗次數(shù)降級:主要是一些不穩(wěn)定的 api,當失敗調(diào)用次數(shù)達到一定閥值自動降級,同樣要使用異步機制探測回復(fù)情況;
- 故障降級:如要調(diào)用的遠程服務(wù)掛掉了(網(wǎng)絡(luò)故障、DNS故障、http服務(wù)返回錯誤的狀態(tài)碼、rpc服務(wù)拋出異常),則可以直接降級。降級后的處理方案有:默認值(比如庫存服務(wù)掛了,返回默認現(xiàn)貨)、兜底數(shù)據(jù)(比如廣告掛了,返回提前準備好的一些靜態(tài)頁面)、緩存(之前暫存的一些緩存數(shù)據(jù))
- 限流降級:秒殺或者搶購一些限購商品時,此時可能會因為訪問量太大而導(dǎo)致系統(tǒng)崩潰,此時會使用限流來進行限制訪問量,當達到限流閥值,后續(xù)請求會被降級;降級后的處理方案可以是:直接轉(zhuǎn)到Tip提示。
服務(wù)降級就是指服務(wù)器忙,請稍候再試,不讓客戶端等待并立刻返回一個友好提示 fallback。
5.4 緩存
Hystrix提供的請求緩存是一個本地緩存,在分布式環(huán)境下不適用,并且實際開發(fā)中,也不會使用hystrix的請求緩存功能,因為這個功能太多余了,Hystrix的請求緩存只能夠在同一個request請求作用域下才生效,下一次的request請求,會將上一次request的請求緩存給清空。
-
請求緩存介紹
hystrix請求緩存是指:在同一個request請求之下,多次調(diào)用其他微服務(wù)的時候,會將第一次調(diào)用結(jié)果緩存起來,然后之后每次都是從緩存里面獲取數(shù)據(jù)結(jié)果。hystrix緩存的是service層方法的返回結(jié)果,當在controller層中同一個HTTP請求里面,多次調(diào)用service層方法的時候,此時會從緩存中獲取數(shù)據(jù)。
什么叫做同一次HTTP請求呢???
- 一個用戶訪問地址,此時請求進入到controller層,然后我們在controller層方法中,調(diào)用了兩次service層的方法,那么此時第二次調(diào)用service層的方法返回值,將從hystrix緩存里面獲取。
- 就只在一次HTTP請求里面,如果用戶訪問了兩次,那么此時就不是同一次HTTP請求了,第一次的緩存數(shù)據(jù)將會被第二次的緩存數(shù)據(jù)覆蓋掉。
-
開啟hystrix功能
在啟動類上面,需要使用@EnableCircuitBreaker和@EnableHystrix注解,開啟hystrix熔斷器功能,否則hystrix將不生效。兩個注解的作用是相同的,@EnableHystrix注解就已經(jīng)包含了@EnableCircuitBreaker注解,但是官方使用的是@EnableCircuitBreaker注解,所以我們也就按照官方的用法,直接使用@EnableCircuitBreaker注解開啟功能即可。
-
緩存刪除
hystrix也提供了刪除緩存的注解@CacheRemove,當進行一些新增、刪除、更新操作的時候,此時緩存中的數(shù)據(jù)就可能不是最新的了,所以這個時候就需要將緩存中的數(shù)據(jù)刪除。使用@CacheRemove注解,同時指定commandKey屬性,這就是告訴hystrix需要刪除哪個命令下的所有緩存。
5.5 服務(wù)合并監(jiān)控
通常微服務(wù)架構(gòu)中的依賴通過遠程調(diào)用實現(xiàn),而遠程調(diào)用中最常見的問題就是通信消耗與連接數(shù)占用。在高并發(fā)的情況之下,因通信次數(shù)的增加,總的通信時間消耗將會變的不那么理想。同時,因為對依賴服務(wù)的線程池資源有限,將出現(xiàn)排隊等待與響應(yīng)延遲的情況。為了優(yōu)化這兩個問題,Hystrix提供了HystrixCollapser來實現(xiàn)請求的合并,以減少通信消耗和線程數(shù)的占用。
HystrixCollapser實現(xiàn)了在HystrixCommand之前放置一個合并處理器,它將處于一個很短時間窗(默認10毫秒)內(nèi)對同一依賴服務(wù)的多個請求進行整合并以批量方式發(fā)起請求的功能(服務(wù)提供方也需要提供相應(yīng)的批量實現(xiàn)接口)。通過HystrixCollapser的封裝,開發(fā)者不需要去關(guān)注線程合并的細節(jié)過程,只需要關(guān)注批量化服務(wù)和處理。下面我們從HystrixCollapser的使用實例,對其合并請求的過程一探究竟。
五、Hystrix總結(jié)
Hystrix的設(shè)計目的就是為了提高系統(tǒng)的彈性和高可用。彈性主要體現(xiàn)在Hystrix的熔斷、降級、快速恢復(fù)和實時監(jiān)控的功能,當設(shè)置了Hystrix的熔斷和降級,由于某種原因?qū)е路?wù)熔斷后,時間段內(nèi)之間返回fallback,時間段之后Hystrix成半打開狀態(tài),檢測服務(wù)是否可用,如果可用,熔斷關(guān)閉,接收請求,否則,時間段內(nèi)繼續(xù)保持熔斷開啟。文章來源:http://www.zghlxwxcb.cn/news/detail-577979.html
雖然現(xiàn)在Hystrix官網(wǎng)宣布進入維護模式,停更了,也是很老的微服務(wù)技術(shù),現(xiàn)有很多的技術(shù)取而代之,但是,Hystrix的思想一直在,現(xiàn)在很多的技術(shù)仍然是借鑒的Hystrix理論知識,學(xué)習(xí)Hystrix,能讓我們更好的學(xué)習(xí)其他的微服務(wù)知識。文章來源地址http://www.zghlxwxcb.cn/news/detail-577979.html
到了這里,關(guān)于【Spring Cloud系列】Hystrix應(yīng)用詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!