摘要:該文研究了新一代輕量級的容錯框架Resilience4j結構功能,結合熔斷器工作方式與熔斷參數,針對服務的熔斷閾值配置問題,提出了一個Resilience4j在微服務平臺上的配置方案。根據不同服務的緊迫性,實行不同的配置策略,提升服務性能,有效保護微服務系統。
關鍵詞:Resilience4j容錯框架;熔斷策略;微服務;閾值
doi:10.3969/J.ISSN.1672-7274.2024.10.016
中圖分類號:TP 317 文獻標志碼:A 文章編碼:1672-7274(2024)10-00-04
Research on Resilience4j's Circuit Breaker Strategy
Abstract: This paper studies the structure and function of Resilience4j, a new generation lightweight fault-tolerant framework. Combining the working mode of fuses and fuse parameters, we propose a configuration for Resilience4j on microservice platform. Moreover, varied configuration strategies are adopted according to the different urgency depending on services thereby improving the service performance and effectively protecting microservice systems.
Keywords: resilience4j fault-tolerant framework; circuit breaker strategy; microservices; threshold value
1 研究背景
微服務是從單體服務架構演變而來的,是將傳統的一站式單體應用拆分成一個個小型服務單元,每個服務提供獨立的業(yè)務功能,實現架構風格的改變。在微服務架構中存在著多個相互依賴的服務,它們之間需要相互通信、相互調用,為保證系統的穩(wěn)定性增加了各種服務治理組件,包括服務注冊、發(fā)現、監(jiān)控、故障恢復等。任何一個再穩(wěn)健的系統運行時都無法做到百分之百不出現問題,當遇到網絡延時、負載過大響應緩慢、數據庫異常等服務失效的問題時,可能導致服務雪崩,因此微服務框架中需要服務容錯的組件,在服務發(fā)生異常時提供保護,解決服務雪崩效應問題[1-3]。
2 Resilience4j的功xgm3SiAndZ9yTNnMGOEEwg6C7WBVzptWNTOVT6Grk80=能模塊
2.1 斷路器
Resilience4j斷路器是Resilience4j中最核心的組件,用于保護系統免受故障影響。當依賴服務中某下游服務由于某種原因無法及時響應時,上游服務就會因等待而占用資源。這時可使用Resilience4j斷路器,通過斷路器的故障監(jiān)控功能,向上游服務返回一個錯誤響應,避免長時間的等待而引起請求等待累積,防止出現級聯服務故障,阻止故障在微服務系統中的漫延[4-5]。
2.2 重試
Resilience4j的組件Retry提供重試功能,自動重試失敗的遠程操作,相對其他的模塊,重試組件的機制比較簡單。在依賴服務中,當上游服務請求下游服務失敗時,請求端開啟重試機制,每隔一段時間重新發(fā)送業(yè)務請求。如果重試次數在達到設置的最大值之前得到正確的響應,視為處理成功。如果重試次數達到設置的最大值后依然得到失敗的結果,則此時系統將拒絕該請求。通過重試可以降低系統失敗率,但會增加請求操作的響應時間。重試模塊包括了重試配置器、重試注冊機和具體的重試器等組件。配置器封裝重試的次數、嘗試的等待時長等配置,注冊機用于創(chuàng)建和管理重試對象。Resilience4j的重試器可以同步重試,也可以異步重試。
2.3 限流
Resilience4j提供限流器RateLimiter,包含有限流注冊、事件消費者注冊、限流配置、限流事件、事件處理器、事件發(fā)布者、事件消費者、限流監(jiān)控指標等子模塊。對于各種應用來說,隨著業(yè)務的不斷發(fā)展,系統必然會越變越復雜,不管是對接口高并發(fā)的訪問調用,還是惡意調用攻擊,都會產生高峰值的流量,迅速耗盡服務器的處理資源[6]。為了確保服務的高可用和系統的穩(wěn)定性,Resilience4j的RateLimiter模塊采用事件驅動架構,有兩種實現方式,一種是基于信號量(Semaphore-Based RateLimiter),通過Semaphore內置的漏桶算法,控制服務被調用的瞬時并發(fā)數,從而實細粒度的限流控制;另一種是基于原子計算器(Atomic RateLimiter),采用的是令牌桶算法,控制某一時間間隔內的訪問量,以固定速率勻速執(zhí)行,達到平滑突發(fā)流量的效果。
2.4 艙壁模式
Resilience4j中的艙壁組件,也稱為線程隔離。在采用Spring Cloud框架的系統中,服務調用者在調用服務提供者時,如果所有的調用從同一個線程池中獲取線程進行RPC(Remote Procedure Call)調用,某個服務提供者出現異常時,該服務提供者的RPC調用可能很快霸占線程池中所有線程,引起服務器的崩潰。艙壁模式即是為每一個依賴服務創(chuàng)建一個獨立的線程池,這時如果某個依賴服務出現異常,只會導致相應的RPC調用的線程池耗盡,不會影響其他依賴服務的RPC,提升系統的健壯性。Resilience4j中的艙壁模式提供了信號量艙壁和固定線程池艙壁兩種隔離方式。
2.5 超時控制
Resilience4j中限時器TimeLimiter用以實現超時控制,是一個很實用的組件。在微服務體系中,當上游服務調用下游服務的時候,可能由于某種原因而阻塞,使用限時器設置一個愿意等待的最大響應時間,如果這個時間內,下游服務未能做出正常反應,就斷開請求,釋放掉線程,既能避免無限期的等待,也能確保遠程調用不會無限期地占用服務器資源。
3 Resilience4j的熔斷器配置
3.1 Resilience4j熔斷器的工作方式
Resilience4j斷路器用于提高系統的可靠性和穩(wěn)定性,有三種常用的狀態(tài):關閉(CLOSED)、打開(OPEN)、半開(HALF_OPEN),正常工作時處理關閉狀態(tài)。Resilience4j斷路器的工作思想是,隨時監(jiān)控遠程服務,在遠程調用超時或失敗時,斷路器及時轉為OPEN狀態(tài),暫停遠程服務的調用,等待遠程服務的恢復。Resilience4j斷路器的工作原理是,通過滑動窗口來存儲和統計遠程服務的調用結果,判斷遠程調用是否正常,它有兩種統計形式:基于計數(Count-based)的滑動窗口和基于時間(Time-based)的滑動窗口,均基于Metrics類實現。
基于計數的滑動窗口是通過統計最近N次調用的結果來實現的,N的默認值為100,即統計100個請求的成功或失敗的情況,在實際應用中可根據需要配置要統計的窗口大小。滑動窗口通常由N個測量值的指標數組來實現,通過取余運算不斷后移窗口位置,新數據滾動覆蓋最舊的數據,不斷更新聚合數據,當遠程調用異常的次數超過設置的閾值時,斷路器開始動作。resilience4j默認是使用基于計數的滑動窗口統計失敗率。
基于時間的滑動窗口,通過統計最近N秒的調用結果來實現的,即統計N秒內窗口內的請求的成功或失敗情況。時間周期的單位默認值為1秒,所以滑動窗口由N個存儲桶的指標數組實現,數組中每個桶分別存儲當前秒或之前每秒的遠程調用的結果,當失敗或慢調用百分比高于配置的閾值時,斷路器的狀態(tài)從CLOSED轉為OPEN。
3.2 Resilience4j熔斷器的配置
(1)熔斷器狀態(tài)切換的閾值:滑動窗口類型選定基于次數還是基于時間,滑動窗口大小設定統計失敗率的滑動窗口大小,最小請求數量決定熔斷器開始動作之前的最小請求數量閾值,請求失敗率或慢調用比率用以判斷熔斷器是否打開(OPEN),全開狀態(tài)等待時延用以確定狀態(tài)從全打開(OPEN)到半開(HALF_OPEN)的時長以及允許半打開狀態(tài)的最大連接數。通過事件的監(jiān)聽器評估是否切斷服務,是否需要進行狀態(tài)的切換,開啟切斷服務后的邏輯流程。
(2)重試配置:熔斷器在請求失敗的狀態(tài)下,通常配置重試的最大次數和每次重試之間的時間間隔,用于評估異常是否還存在,是否恢復正常的業(yè)務邏輯處理。
(3)限流配置:熔斷器在關閉狀態(tài)下,通常配置特定的時間周期內允許的最大請求數、刷新周期、允許執(zhí)行的最大時間,防止過量的請求導致系統負擔過重而崩潰。
4 在微服務平臺中的應用
熔斷、限流與重試是微服務治理中最主要的功能模塊,能很方便地集成到微服務框架中。Resilience4j在Spring Cloud下提供CircuitBreakerFactory的封裝,在實際應用中使用Resilience4j時,只需要與實際場景結合使用,合理配置這3個模塊,即可保護應用系統免受異常情況影響,幫助應用系統在面對網絡異常和故障時保持穩(wěn)定性和可靠性。
比如,在游戲服務平臺中,為了保存較高的性能,根據服務拆分方法將服務拆分得到的一個個獨立的服務,包括用戶服務、運營服務、角色信息服務、游戲邏輯服務、場景服務、聊天服務等,各個服務有明確的規(guī)則和接口,多個服務協同工作以便滿足高可用和高性能的需求。當客戶端提出請求時,多個服務協作完成服務響應。微服務之間雖然推薦使用REST風格的請求暴露服務接口,完成數據交互,但REST風格性能欠缺,可以使用遠程調用技術,并使用Resilience4j對服務調用進行保護,以避免出現雪崩效應,保證服務的穩(wěn)健性。
當某個服務異常時,熔斷器打開并返回空信息。在游戲服務平臺中,如果是非緊迫服務,比如運營服務、聊天服務等,這些服務異常引起最壞的情況就是界面中暫時缺失某個板塊的信息,僅會給游戲參與者造成欠佳的體驗,平臺對外服務不受影響。在配置熔斷參數時,非緊迫服務可稍早熔斷,盡量降低影響的范圍,保證整體服務持續(xù)運行,避免整個服務被拖垮。
從Resilience4j的官方文檔中可以看出,在Resilience4j的實際運用中,可選的配置參數非常多,在一個應用系統中需要配置哪些參數沒有固定的標準,這對于經驗不足的開發(fā)人員來說,可能有些困難,特別是熔斷閾值的配置。google sre提出的一種按概率p將請求丟棄的算法:
式中,requests表示調用方發(fā)起的請求總數;accepts表示被調用方正常處理的請求數量;k表示敏感系數,一般設置在1.5~2之間。在系統工作正常的情況下,請求均能得到處理,也就是requests等于accepts。當上游服務出現異常時,正常處理的請求(accepts)開始逐漸小于請求總數(requests),一直到request-k*accepts為正值,超過設定的數值時,熔斷器啟動丟棄請求的機制,所以k越大,敏感度越低。在配置Resilience4j閾值時,可以借用公式來推算,對不同的服務設置不同的熔斷閾值。
對于游戲服務平臺中的運營服務、聊天服務等非緊迫性的服務,可以設置較高的敏感度,即較小的熔斷閾值。式(1)中當k取值1.5時,丟棄請求的概率為
則從式(2)可以得到:
因此,對于這些非關鍵的服務,不會影響系統的運行,可以將熔斷閾值設置較小值為33,使系統能及時做出響應,將相關服務降級,既能避免服務異常的漫延,也能為其他服務提供更多的資源。但對于關鍵的服務,則設置較低的敏感度,即較高的熔斷閾值。式(1)中當k取值2時,丟棄請求的概率為
則從式(4)可以得到:
因此,對于游戲邏輯服務、場景服務等緊迫性的服務,應將熔斷閾值設置為較大值50,以保存關鍵服務的正常運行,盡力保證用戶的使用體驗。
配置時先使用CircuitBreakerConfig配置滑動窗口大小、失敗熔斷閾值、慢請求閾值、半開狀態(tài)下允許請求的次數、異常謂語判斷等參數,然后在CircuitBreakerRegistry中注冊,使用注冊機生成熔斷器實例,賦于熔斷器名稱。同樣以類似方式生成重試實例、限流器實例,重試實例配置中指定目標方法調用失敗后重試的時間間隔及最多重試次數等參數,限流器配置最大請求數、刷新周期、允許執(zhí)行的最大時間等參數。開發(fā)時采用裝飾器模式,將熔斷器、Retry實例、限流器實例裝飾到目標Supplier,最后使用Vavr的Try.of(...)或Try.run(...)執(zhí)行被裝飾的Supplier,并綁定方法recover(),提供異常發(fā)生后的降級處理。
5 結束語
本文介紹了Resilience4j的容錯框架的組成、工作原理及熔斷策略,并在此的基礎上探討了Resilience4j在游戲服務平臺上的應用。對于高并發(fā)的微服務系統來說,提高性能、保證服務高可用、提升用戶訪問體驗等是系統優(yōu)化的主要目標,Resilience4j容錯框架在微服務系統中的應用,能夠降低服務異常時的影響范圍,避免系統服務被異常拖垮,保障系統的穩(wěn)定性和高可用性,可有效保護微服務系統。
參考文獻
[1] 徐東.基于微服務架構的性能監(jiān)控體系的設計與實現[J].信息工程大學學報,2023,24(3):356-363.
[2] Li Y, Zhang Y, Zhou Z, et al. Intelligent Flow Control Algorithm for Microservice System[J]. Cognitive Computation and Systems, 2021, 3(3): 276-285.
[3] 黨楠.一種動態(tài)流量控制方法的研究與實現[D].杭州:浙江大學,2021.
[4] 吳化堯,鄧文?。嫦蛭⒎哲浖_發(fā)方法研究進展[J].計算機研究與發(fā)展,2020,57(3):525-541.
[5] 田偉.微服務自適應流量控制與故障根因定位機制研究與實現[D].北京:北京郵電大學,2023.
[6] 高偉.微服務使能平臺研究與實踐[J].網絡安全與信息化,2023(10):95-98.