1. 程式人生 > >Hystrix限流降級

Hystrix限流降級

Hystrix:供分散式系統使用,提供延遲和容錯功能,隔離遠端系統、訪問和第三方程式庫的訪問點,防止級聯失敗,保證複雜的分佈系統在面臨不可避免的失敗時,仍能有其彈性。

今天稍微複雜點的網際網路應用,服務端基本都是分散式的,大量的服務支撐起整個系統,服務之間也難免有大量的依賴關係,依賴都是通過網路連線起來。

 在高併發訪問下,這些依賴的穩定性與否對系統的影響非常大,但是依賴有很多不可控問題:如網路連線緩慢,資源繁忙,暫時不可用,服務離線等。

然而任何一個服務的可用性都不是 100% 的,網路亦是脆弱的。當我依賴的某個服務不可用的時候,我自身是否會被拖死?當網路不穩定的時候,我自身是否會被拖死?這些在單機環境下不太需要考慮的問題,在分散式環境下就不得不考慮了。假設我有5個依賴的服務,他們的可用性都是99.95%,即一年不可用時間約為4個多小時,那麼是否意味著我的可用性最多就是 99.95% 的5次方,99.75%(近乎一天),再加上網路不穩定因素、依賴服務可能更多,可用性會更低。考慮到所依賴的服務必定會在某些時間不可用,考慮到網路必定會不穩定,我們應該怎麼設計自身服務?即,怎麼為出錯設計?

Michael T. Nygard 在在精彩的《Release It!》一書中總結了很多提高系統可用性的模式,其中非常重要的兩條是:

  1. 使用超時
  2. 使用斷路器

第一條,通過網路呼叫外部依賴服務的時候,都必須應該設定超時。在健康的情況下,一般局域往的一次遠端呼叫在幾十毫秒內就返回了,但是當網路擁堵的時候,或者所依賴服務不可用的時候,這個時間可能是好多秒,或者壓根就僵死了。通常情況下,一次遠端呼叫對應了一個執行緒或者程序,如果響應太慢,或者僵死了,那一個程序/執行緒,就被拖死,短時間內得不到釋放,而程序/執行緒都對應了系統資源,這就等於說我自身服務資源會被耗盡,導致自身服務不可用。假設我的服務依賴於很多服務,其中一個非核心的依賴如果不可用,而且沒有超時機制,那麼這個非核心依賴就能拖死我的服務,儘管理論上即使沒有它我在大部分情況還能健康運轉的。

斷路器其實我們大家都不陌生(你會換保險絲麼?),如果你家沒有斷路器,當電流過載,或者短路的時候,電路不斷開,電線就會升溫,造成火災,燒掉房子。有了斷路器之後,電流過載的時候,保險絲就會首先燒掉,斷開電路,不至於引起更大的災難(只不過這個時候你得換保險絲)。

超時機制和斷路器能夠很好的保護我們的服務,不受依賴服務不可用的影響太大,具體可以參看文章《 使用熔斷器設計模式保護軟體。然而具體實現這兩個模式還是有一定的複雜度的,所幸 Netflix 開源的 Hystrix框架 幫我們大大簡化了超時機制和斷路器的實現.