一、前言
在分布式系統(tǒng)架構(gòu)中多個系統(tǒng)之間通常是通過遠程RPC調(diào)用進行通信饺鹃,也就是 A 系統(tǒng)調(diào)用 B 系統(tǒng)服務莫秆,B 系統(tǒng)調(diào)用 C 系統(tǒng)的服務。當尾部應用 C 發(fā)生故障而系統(tǒng) B 沒有服務降級時候可能會導致 B悔详,甚至系統(tǒng) A 癱瘓镊屎,這種現(xiàn)象被稱為雪崩現(xiàn)象。所以在系統(tǒng)設(shè)計時候要使用一定的降級策略茄螃,來保證當服務提供方服務不可用時候缝驳,服務調(diào)用方可以切換到降級后的策略進行執(zhí)行。
二、Hystrix 中基于自反饋調(diào)節(jié)熔斷狀態(tài)的算法原理
我們可以把熔斷器想象為一個保險絲用狱,在電路系統(tǒng)中萎庭,一般在所有的家電系統(tǒng)連接外部供電的線路中間都會加一個保險絲,當外部電壓過高齿拂,達到保險絲的熔點時候驳规,保險絲就會被熔斷,從而可以切斷家電系統(tǒng)與外部電路的聯(lián)通署海,進而保障家電系統(tǒng)不會因為電壓過高而損壞吗购。
Hystrix提供的熔斷器就有類似功能,當在一定時間段內(nèi)服務調(diào)用方調(diào)用服務提供方的服務的次數(shù)達到設(shè)定的閾值砸狞,并且出錯的次數(shù)也達到設(shè)置的出錯閾值捻勉,就會進行服務降級,讓服務調(diào)用方之間執(zhí)行本地設(shè)置的降級策略刀森,而不再發(fā)起遠程調(diào)用踱启。但是Hystrix提供的熔斷器具有自我反饋,自我恢復的功能研底,Hystrix會根據(jù)調(diào)用接口的情況埠偿,讓熔斷器在closed,open,half-open三種狀態(tài)之間自動切換。
open狀態(tài)說明打開熔斷榜晦,也就是服務調(diào)用方執(zhí)行本地降級策略冠蒋,不進行遠程調(diào)用。
closed狀態(tài)說明關(guān)閉了熔斷乾胶,這時候服務調(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:當服務接口對應的熔斷器狀態(tài)為open狀態(tài)時候脓恕,所有服務調(diào)用方調(diào)用該服務方法時候都是執(zhí)行本地降級方法,那么什么時候才會恢復到遠程調(diào)用那窿侈?Hystrix提供了一種測試策略炼幔,也就是設(shè)置了一個時間窗口,從熔斷器狀態(tài)變?yōu)閛pen狀態(tài)開始的一個時間窗口內(nèi)史简,調(diào)用該服務接口時候都委托服務降級方法進行執(zhí)行乃秀。如果時間超過了時間窗口肛著,則把熔斷狀態(tài)從open->half-open,這時候服務調(diào)用方調(diào)用服務接口時候,就可以發(fā)起遠程調(diào)用而不再使用本地降級接口跺讯,如果發(fā)起遠程調(diào)用還是失敗枢贿,則重新設(shè)置熔斷器狀態(tài)為open狀態(tài),從新記錄時間窗口開始時間刀脏。
half-open->closed: 當熔斷器狀態(tài)為half-open,這時候服務調(diào)用方調(diào)用服務接口時候局荚,就可以發(fā)起遠程調(diào)用而不再使用本地降級接口,如果發(fā)起遠程調(diào)用成功愈污,則重新設(shè)置熔斷器狀態(tài)為closed狀態(tài)耀态。
那么有一個問題,用來判斷熔斷器從closed->open轉(zhuǎn)換的數(shù)據(jù)是哪里來的那暂雹?其實這個是HystrixCommandMetrics對象來做的首装,該對象用來存在HystrixCommand的一些指標數(shù)據(jù),比如接口調(diào)用次數(shù)杭跪,調(diào)用接口失敗的次數(shù)等等仙逻,后面我們會講解。
三涧尿、總結(jié)
系統(tǒng)設(shè)計時候要使用一定的降級策略系奉,來保證當服務提供方服務不可用時候,服務調(diào)用方可以切換到降級后的策略進行執(zhí)行现斋,Hystrix作為熔斷器組件使用范圍還是很廣泛的.
更多關(guān)于分布式系統(tǒng)中服務降級策略的知識可以單擊 單擊我
想系統(tǒng)學dubbo的單擊我
想學并發(fā)的童鞋可以 單擊我