天天看點

微服務容錯元件 Hystrix 設計分析

作者:慕楓技術筆記

#頭條創作挑戰賽#

引言

在分布式微服務場景下,由于各個業務服務的縱向拆分,加上通常會使用叢集技術來保障業務服務的可靠性,由此導緻了應用服務節點的爆炸式增長,服務節點的增多會導緻出故障的機率也随之增加。如之前文章所闡述的,某個應用節點的不可用可能導緻最終整個平台正常運作受影響,是以我們需要一些手段去應對這種異常情況。Hystrix正是一種專門針對微服務容錯處理的基礎元件,本文主要針對容錯元件Hystrix進行設計分析,希望對大家有所裨益。

微服務容錯元件 Hystrix 設計分析

Hystrix 是什麼?

由于微服務架構的風靡于世,在微服務分布式場景中,某些服務節點既是上遊業務的依賴方又是下遊業務的調用方,各個服務的之間的依賴關系形成我們具體的業務處理流程。在實際的生産環境中,許多服務依賴項中在運作過程中或許由于代碼問題、或許由于資源使用問題,可能會出現服務響應慢以及無法響應等問題。Hystrix 是 Netflix 提供的一款服務容錯基礎元件,通過引入它可以給原有的應用添加延遲容忍和容錯邏輯,以達到提升整個微服務架構的服務治理能力的目的。Hystrix 通過隔離服務之間的通路點、阻止跨服務的級聯故障以及提供降級通路機制實作以提高系統的整體彈性以及穩定性。

微服務容錯元件 Hystrix 設計分析

Hystrix 解決什麼問題?

複雜的分布式架構中,應用程式的叢集節點及其依賴項服務節點非常多,節點出現問題之後如何進行及時容錯處理是微服務架構穩定性以及可靠性的重要展現,那麼 Hystrix 到底可以為我們解決那些問題呢?

1、 阻止某個有問題調用耗盡系統的所有線程,限制線程資源消耗;

2、阻止錯誤在分布式系統之間的傳播;

3、快速失敗代替請求排隊;

4、錯誤回退、優雅的服務降級;

Hystrix 原理分析

1、問題分析

如下圖所示,應用請求會進入所有後端服務叢集。如果各個服務節點都是正常的,那麼服務節點便會正常響應, 對應的依賴的服務也會正常運作,一切看起來都很美好。

微服務容錯元件 Hystrix 設計分析

但是現實總是很殘酷的,如果依賴的某個服務節點出現異常,比如此時服務正在進行 full GC,無法響應外部請求。是以此時的使用者請求會被阻塞住。如下圖所示,使用者請求分别調用服務 A、H、I 以及 P 服務來完成某項業務流程,但是此時服務 I 出現異常或者服務 I 叢集的某個節點出現了異常,雖然兩者的連接配接還保持着,但是所有發送過去的業務請求都出現 timeout。那麼此時調用方的工作線程就會被阻塞住,導緻調用方出現線程不斷被被占用的情況。

微服務容錯元件 Hystrix 設計分析

在流量較大的場景下,由于後端某些節點的異常,服務提供者不可用,如下圖的依賴 I 服務不可用,請求無法正常傳回,那麼調用方會不斷進行重試進一步加大流量,最終導緻調用方線程資源耗盡,導緻服務調用者不可用。服務調用者也可能是上遊服務的服務提供方,由于請求資源不斷被占用,同時導緻上遊依賴應用同步被影響,最後故障點會蔓延到整個平台中。

微服務容錯元件 Hystrix 設計分析

2、問題破解

既然微服務架構中某個節點的異常可能導緻整個平台的不可用,有什麼好的解決方案可以解決這個問題呢?如果說這個故障節點就像是病毒傳播的一号病人一樣,那麼隻要及時的發現以及隔離它,避免異常節點的進一步影響發散,是不是就可以解決微服務架構各個服務之間的依賴調用異常導緻的問題。基于此的分析,我們希望借助 Hystrix 實作如下的幾點核心邏輯:

資源隔離:限制調用服務使用的資源,當某一下遊服務出現問題時,不會影響整個服務調用鍊。

服務熔斷:當失敗率達到閥值自動觸發熔斷,熔斷器觸發後原有的請求鍊路被切斷,請求無法正常觸達服務提供方。

服務降級:逾時、資源不足等異常觸發熔斷後,需要調用預設的降級接口傳回兜底資料,提升平台容錯能力。

微服務容錯元件 Hystrix 設計分析

3、實作原理

(1)業務流程

如果想要實作異常情況的熔斷保護,首先我們得有個斷路器,由它作為調用流量的開關。大緻的運作邏輯如下圖所示,服務調用時判斷斷路器是否打開,如果打開了則進行降級操作,果沒有打開則判斷信号量以及線程池是否拒絕,如果拒絕則同樣執行降級流程。如果正常則上報自己的健康狀态。執行正常流程看是否成功,失敗了則執行降級流程。如果成功了,則上報監控資料,如果逾時同樣是執行降級政策。

微服務容錯元件 Hystrix 設計分析

(2)斷路器原理分析

斷路器的作用實際就是之前文章中說到的微服務架構中的保險絲一樣,起到保護系統的作用。當對下遊服務調用異常量達到設定門檻值後,将斷路器打開,觸發熔斷操作,避免流量繼續堆積。

斷路器涉及到的主要設計點主要包括兩項,一個是斷路器的控制邏輯(控制斷路器開關的打開和關閉),另一個是觸發斷路操作的門檻值判斷與資料統計(統計資料作為斷路器的操作判斷)。對于斷路器本身來說表面上看就是斷路器的開關打開或者關閉來控制是否走降級邏輯,實際上核心的邏輯是如何判斷什麼時候該開以及什麼時候該關。

微服務容錯元件 Hystrix 設計分析

斷路器邏輯控制

斷路器的狀态轉換和注冊中心的服務是否線上有點類似,都涉及到狀态的變化,隻不過斷路器多了個半打開的狀态。是以實際上還需要對服務是否恢複正常進行判斷的過程。大緻流程如上圖所示,斷路器的初始狀态是關閉狀态,一旦請求失敗情況達到了門檻值便會打開斷路器。斷路器打開後需要進行探測,探測什麼時候異常恢複之後還是要将斷路器進行關閉的。但是在打開斷路器之後不會立馬進行探測,而是需要經曆個視窗期,不然立馬重試必然還是失敗,這個視窗期就相當于給别人一個恢複的時間視窗。

當過了視窗期之後,将一些請求進行放開,讓其完成正常的下遊業務調用,進行請求試探,如果成功則關閉斷路器,如果失敗則繼續維持目前斷路器的 OPEN 狀态。當然至于探測這塊不是說一次成功或者失敗就改變斷路器現有的狀态,這裡可以設定對應的狀态變更政策。

門檻值統計

門檻值以及資料統計是進行開關打開的判斷依據,是以如何統計資料是非常關鍵的設計。如果門檻值統計不夠準确有效,那麼實際無法起到該有的作用,如果斷路器過于敏感,偶爾的調用異常就打開斷路器(網絡抖動等),勢必會嚴重影響正常的業務流程。如果斷路器過于遲鈍,該打開的時候不打開,那麼可能導緻異常在全平台的傳播。

微服務容錯元件 Hystrix 設計分析

既然不能通過一次的調用成功或者失敗來判斷,那麼我們可以把統計的周期拉長,通過幾個周期來判斷。同時為了保證判斷的時效性,統計的周期需要不斷更新。如上圖所示,一開始的統計周期是 0-7,過了一個時間節點後統計周期就是 1-8,時間間隔不變但是統計的開始時間和結束時間是實時更新的,這就類似一個滑動視窗,随着時間的推移不斷向前行進,保障統計的時效。

微服務容錯元件 Hystrix 設計分析

(3)隔離設計

Hystrix通過隔離的方式來限制異常節點通路對平台的影響,這個就類似于之前我文章提到的船艙内的隔闆,限制異常影響範圍。主要包括線程池隔離以及信号量隔離。

微服務容錯元件 Hystrix 設計分析

線程隔離

如上圖所示,線上程隔離的實作方式中,通過将使用者請求線程與Hystrix元件線程進行隔離,如果出現服務提供方不可用的情況,阻塞的線程是線程池沖配置設定的線程,将資源隔離的影響降到最低。元件包裝依賴調用邏輯,每個調用conmand在單獨線程池中執行,限制線程資源占用。

微服務容錯元件 Hystrix 設計分析

通過發送請求線程與執行請求的線程資源隔離,可有效防止發生級聯故障。當線程池或請求隊列飽和時,Hystrix 将拒絕服務,使得服務請求線程可以 fast-fail,進而避免服務節點問題導緻的依賴異常擴散。

信号量隔離

我們都知道線程池的引入會帶來一定的資源消耗,因為涉及到線程池内部的線程資源排程。是以比較适合引入線程池帶來的好處多于資源調用損耗的場景。在一般的場景下,使用更加輕量級的隔離方式會更加适合,那麼信号量正是這種輕量級的隔離方式,不存線上程上下文切換所帶來的性能開銷。從隔離設計的第一張圖中我們可以看出使用線程池時,發送請求的線程和執行依賴服務的線程不是同一個,線程池的使用方式就是将它們進行了隔離。而使用信号量時,發送請求的線程和執行依賴服務的線程是同一個線程, 都是發起請求的線程,信号量隔離限制對某個資源調用的并發數。

總結

本文主要對微服務架構中服務容錯降級進行背景問題分析,闡述了服務容錯元件 Hystrix 元件在服務容錯、降價以及熔斷方面的設計内容。相信大家對于服務容錯這塊内容有了更加深刻的了解。在後面的文章中,筆者将會對 Hystrix 元件在開發的微服務應用中具體的應用進行說明,請大家敬請期待。

繼續閱讀