Circuit Breaker翻譯過來叫做斷路器,新建的小區裡家家都有,就是這個東西:
熟悉吧,斷路器的作用嘛,如果你在家裡從來沒用過或者關注過這個東西,我來講講:當線路短路、或是過載電路會自動切斷電源。
它跟另外有個叫做熔斷器的有類似之處。熔斷器英文名叫Fuse,這個樣子:
斷路器和熔斷器相比較,斷路器在短路之後還能夠恢復,合上閘之後繼續用;熔斷器就不是了,斷了之後就需要更換電阻絲,重新接上線之後才能使用。
上面說了這兩個裝置,而且配了圖,目的是為了引出本節的主題:Circuit Breaker Pattern,斷路器模式。
稍穿插一些情懷層面的東西:OO程式設計裡的類講究把自然界的物體類化為Class,Class有它自己的屬性和行為,好比蘋果是紅的,蘋果可以吃;在雲化的軟體體系結構裡,系統裡的各個模組更是接近於真實世界的功能元件,真實世界裡的各個部門、或是各個組成部分往往都會直接對映為雲化系統裡的某個容器。碼農所沉浸的世界裡,不僅僅是邏輯和程式碼,反而更是真實的世界,所以在講斷路器模式之前,我們講講電路里斷路器是有必要的。
進入正題,在分散式的軟體體系結構中,一個服務會因各種問題而不能正常工作,比如伺服器負荷太大,或是底層資料資源池不可用、或者網路短時期不穩定、或伺服器損壞等等。這個服務有可能是短暫性的工作不正常,也有可能是徹底壞了。
問題一:對於短暫性的工作不正常,如果服務的呼叫者沒有一點仁義之心,卯足了勁不間斷呼叫,那麼這個短暫性的不正常可能會因為呼叫者的關係而很難恢復。
問題二:對於徹底性的損壞,對呼叫者而言,它沒必要反覆嘗試,看看服務工作正常了沒有,這對於呼叫者而言,是無謂的效能損耗,且於事無補。
斷路器模式就是為了解決這兩個問題而生的。
一個服務有三種狀態,分別是open、closed和half-open。open表示閘開,這時服務不工作,closed表示合閘,這時服務工作,half-open表示服務短暫性不工作、等待恢復。這三種狀態之間的轉換關係如下圖(圖中Trip是跳閘的意思):
當服務太慢時,服務由closed狀態切換到Half Open,直至服務恢復正常;當服務損壞,服務轉成open狀態。
具體到斷路器模式的實現方式上:把現有服務(supplier)封裝成一個circuit breaker,客戶端的情況轉由circuit breaker來處理。Circuit Breaker檢測timeout情況,根據timeout的次數將服務自動切換為half-open或close狀態,看時序圖:
在Akka和Netflix/Hystrix中封裝了Circuit Breaker Pattern的實現。
本文參考了:
1)Reactive Microservices Architecture - O"Reilly Media
2)Circuit breaker design pattern(WIKI)
Circuit Breaker翻譯過來叫做斷路器,新建的小區裡家家都有,就是這個東西:
熟悉吧,斷路器的作用嘛,如果你在家裡從來沒用過或者關注過這個東西,我來講講:當線路短路、或是過載電路會自動切斷電源。
它跟另外有個叫做熔斷器的有類似之處。熔斷器英文名叫Fuse,這個樣子:
斷路器和熔斷器相比較,斷路器在短路之後還能夠恢復,合上閘之後繼續用;熔斷器就不是了,斷了之後就需要更換電阻絲,重新接上線之後才能使用。
上面說了這兩個裝置,而且配了圖,目的是為了引出本節的主題:Circuit Breaker Pattern,斷路器模式。
稍穿插一些情懷層面的東西:OO程式設計裡的類講究把自然界的物體類化為Class,Class有它自己的屬性和行為,好比蘋果是紅的,蘋果可以吃;在雲化的軟體體系結構裡,系統裡的各個模組更是接近於真實世界的功能元件,真實世界裡的各個部門、或是各個組成部分往往都會直接對映為雲化系統裡的某個容器。碼農所沉浸的世界裡,不僅僅是邏輯和程式碼,反而更是真實的世界,所以在講斷路器模式之前,我們講講電路里斷路器是有必要的。
進入正題,在分散式的軟體體系結構中,一個服務會因各種問題而不能正常工作,比如伺服器負荷太大,或是底層資料資源池不可用、或者網路短時期不穩定、或伺服器損壞等等。這個服務有可能是短暫性的工作不正常,也有可能是徹底壞了。
問題一:對於短暫性的工作不正常,如果服務的呼叫者沒有一點仁義之心,卯足了勁不間斷呼叫,那麼這個短暫性的不正常可能會因為呼叫者的關係而很難恢復。
問題二:對於徹底性的損壞,對呼叫者而言,它沒必要反覆嘗試,看看服務工作正常了沒有,這對於呼叫者而言,是無謂的效能損耗,且於事無補。
斷路器模式就是為了解決這兩個問題而生的。
一個服務有三種狀態,分別是open、closed和half-open。open表示閘開,這時服務不工作,closed表示合閘,這時服務工作,half-open表示服務短暫性不工作、等待恢復。這三種狀態之間的轉換關係如下圖(圖中Trip是跳閘的意思):
當服務太慢時,服務由closed狀態切換到Half Open,直至服務恢復正常;當服務損壞,服務轉成open狀態。
具體到斷路器模式的實現方式上:把現有服務(supplier)封裝成一個circuit breaker,客戶端的情況轉由circuit breaker來處理。Circuit Breaker檢測timeout情況,根據timeout的次數將服務自動切換為half-open或close狀態,看時序圖:
在Akka和Netflix/Hystrix中封裝了Circuit Breaker Pattern的實現。
本文參考了:
1)Reactive Microservices Architecture - O"Reilly Media
2)Circuit breaker design pattern(WIKI)