Service Mesh (ASM)支援統一管理叢集南北與東西向的所有流量,通過對流量的逾時、重試、限流、熔斷、排隊、預熱、回退等配置,基於服務網格從多個維度提升分布式系統的高可用能力。本文主要介紹各種服務網格高可用能力的概念以及使用情境。
能力介紹
在分布式系統中,流量的防護與調度是確保系統穩定性和高可用能力的重要因素。由於分布式系統的高度複雜性,任何流量的波動和異常都有可能導致服務失敗、雪崩、資源耗盡等問題。
在傳統的服務開發中,使用Resilience4j等架構可以實現限流、熔斷等高可用能力。與這種方式相比,服務網格在網路基礎設施層級提供支援,無侵入式進行整合,降低高可用能力的耦合并提升配置靈活性。
各高可用能力詳細說明如下:
流量限流:保護系統免於過載
限流是分布式系統中保障服務穩定性的基礎手段之一。在面臨高流量衝擊、服務過載、資源耗盡或惡意攻擊的情況下,通過配置限流防護,可以實現對流量的精準控制,從而保護後端服務的穩定性,降低成本並提升使用者體驗。同時,在業務存在多租戶情境的情況下,還可以通過對每個租戶進行分別限流,達到精細化流量管理和確保公平使用的目的。
ASM通過多種限流策略為分布式系統提供全面的保護能力:
本地限流與全域限流
網格代理Envoy原生支援兩種類型的限流防護方式:本地限流和全域限流。
適用情境
本地限流與全域限流可以支援大部分常用的限流情境:對叢集中的某個服務進行限流、或在網關的特定路由上進行限流,支援匹配特定的請求單獨指定限流配額。
基於ASM流量調度套件進行限流
ASM流量調度套件是一套基於服務網格的流量統一調度架構模式,以及基於該架構模式開發的多種流量調度策略的統稱,旨在對雲原生分布式應用中的請求進行統一的負載調度與管理。ASM流量調度套件支援使用RateLimitingPolicy策略進行限流。
適用情境
與本地限流/全域限流相比,RateLimitingPolicy支援按請求標籤對請求進行分組,並在每個分組內單獨限流的進階特性,適用於在多租戶環境下對每個租戶進行單獨限流的精細化控制情境。
流量並發度控制:保護系統關鍵資源
並發度控制是另一種重要的高可用能力,它通過對請求並發數的精準管理,避免因過多的並發請求導致系統資源耗盡。相對於流量限流,並發度控制適用於一些依賴系統關鍵資源的服務(如線程池、資料庫等),以保護系統關鍵資源並提高資源利用效率。
ASM提供兩種主要的並發度控制機制:
基於ASM流量調度套件進行並發度控制
ASM流量調度套件支援使用ConcurrencyLimitingPolicy實現請求並發數控制。
適用情境
當系統並發度承載能力相對固定時,可以針對叢集中的某個服務配置固定的並發度限制,超出給定並發度的請求將返回429響應。
使用ASMAdaptiveConcurrency實現自適應並發控制
網格代理Envoy原生支援一種自適應的並發度控制方式,支援通過ASMAdaptiveConcurrency進行啟用。ASMAdaptiveConcurrency採用自適應並發控制演算法,從而儘可能使得並發限制數量在服務可承受的範圍附近,同時拒絕超出該限制的請求(拒絕請求時會返回HTTP 503及錯誤資訊reached concurrency limit)。
適用情境
當系統承載能力變化較大且難以準確估計時,可以通過ASM的AdaptiveConcurrency(自適應並發控制)來對系統進行並發度限制。同時,建議在啟用AdaptiveConcurrency服務的後,通過DestinationRule為服務啟用重試功能。這將使在minRTT計算期間被拒絕的請求能夠通過Sidecar的重試機制儘可能成功返回結果。
流量熔斷:隔離故障節點以防止雪崩效應
熔斷機制是分布式系統中不可或缺的一環,它的作用是在某個服務出現異常時迅速切斷對其的依賴,及時隔離故障服務,從而避免故障擴散到整個系統。
ASM在多個維度和層級上提供流量熔斷功能:
串連池級熔斷
串連池熔斷是目標規則原生支援的熔斷特性,可以限制工作負載到目標服務主機的最大HTTP/1或TCP串連數。
適用情境
串連池熔斷通過TCP串連數限制實現熔斷,作為一種底層比較基礎的熔斷策略,可以用於一些無法通過HTTP返回狀態代碼方式判斷的服務的熔斷配置。
主機級熔斷
主機級熔斷同樣是目標規則原生支援的熔斷特性,通過請求5xx狀態代碼觀察在給定時間段內發生的故障數量。如果錯誤率超過閾值,則熔斷器將斷開請求,所有後續請求都將失敗,直到熔斷器被關閉為止。
適用情境
主機級熔斷檢測獨立地作用於一個服務的每個上遊主機。當一個上遊主機持續返回5xx狀態代碼時,該主機將會從負載平衡池中被驅逐一段時間,以達到熔斷效果。其適用於檢測一些由於單個工作負載問題導致所有的請求響應持續產生錯誤的情況,但不適用於對某個API介面進行熔斷的情境。
路由級熔斷
ASM支援為特定服務之間和特定路由上的東西向調用流量配置熔斷規則。通過為服務間的東西向調用流量配置熔斷規則,可以實現在特定的請求路由上,當流量失敗率或響應逾時次數達到閾值時,主動“切斷”來自上遊服務的請求。
適用情境
路由級熔斷的檢測生效在服務等級,可以在一條虛擬服務路由上對經過該路由的所有請求進行熔斷檢測。其適用於檢測由於某些服務依賴或邏輯錯誤導致的特定服務API持續返回錯誤的情況。
流量回退:應對調用失敗情境
當某個服務發生故障或無法使用時,回退機制會調用一個備用的服務來處理請求,以確保整個系統的穩定性和可用性。
適用情境
同時使用主機級熔斷和流量回退,可以實現當一個服務的所有上遊主機不可用時,改用備用服務提供相應的功能,在熔斷髮生時仍使整個系統保持一定的可用性。
流量預熱:平滑過渡新版本部署
在傳統的藍綠部署或變換中,新版本服務一旦上線就會立即承擔全部流量,這可能導致瞬時壓力過大而引發故障。相比之下,服務預熱允許我們按照預定計劃分階段引入流量,例如先分配10%的請求,再逐步提升至50%、100%。這種方式比較適合那些具有較大冷啟動成本的服務,比如服務需要時間來完成緩衝預熱、資料庫連接初始化等準備工作。
ASM支援兩種層級的流量預熱能力:
慢啟動預熱
慢啟動模式又稱漸進式流量增加,是目標規則原生支援的能力。您可以為服務配置一個時間段,每當一個服務執行個體啟動時,請求方會向該執行個體發送一部分請求負載,並在配置的時間段內逐步增加請求量。當慢啟動視窗期間到達,就會退出慢啟動模式。
適用情境
請求方向目標服務發送請求時,如果目標服務的上遊主機端點處於慢啟動視窗中,負載平衡器會適當降低分配給該上遊主機的流量比例。這一能力適用於服務擴容或服務發布新版本的情境,用於對新啟動的服務上遊主機進行預熱。
在新上線服務或可選上遊主機端點有限的情況下,不適用慢啟動預熱功能。
基於ASM流量調度套件進行服務漸進式上線
當新服務發布時,通過同步配置LoadRampingPolicy可以使得服務接收到的流量逐漸增加,確保服務平穩上線。
適用情境
ASM流量調度套件使用一個請求採樣器拒絕一定比例的請求。在服務上線初期請求採樣器將以一個較大的比例拒絕發往服務的請求。而隨著上線時間視窗推移,請求拒絕比例逐漸減少到0。和慢啟動預熱不同,該方式會將發往服務整體的請求進行部分拒絕,保證服務收到的所有流量緩慢增加,適用於新服務上線的情境,而不適用於服務擴容、服務新版本發布等情境。
流量逾時與重試:增強服務調用可靠性
逾時與重試是分布式系統中最常見的容錯手段之一,均為虛擬服務原生支援的高可用能力。通過設定合理的逾時時間和重試策略,確保在服務偶發出現響應錯誤的情況下,仍然使整體系統保持一定的可用性。逾時的作用在於避免請求長時間掛起,而重試則用於彌補網路抖動或臨時故障帶來的影響。
請求排隊與優先順序調度:平穩度過流量高峰
請求排隊是一種基於限流和並發度限制的機制:當請求速率或請求並發度超過系統承載上限時,後續請求不會被直接拒絕,而是進入請求隊列,等待前序請求處理完畢後再進行處理。
ASM通過流量調度套件支援基於並發數、流量速率和延遲自適應的三種優先順序調度策略,並在此基礎上支援對排隊中的請求進行優先順序調度。請求優先順序調度可以確保優先順序高的請求率先得到響應,優先保障系統重要功能的平穩運行,或者優先確保某些高優先順序租戶的使用體驗。
具體支援的請求排隊與優先順序調度策略包括:
可控並發下的請求優先順序調度
通過配置ConcurrencySchedulingPolicy,以指定的並發數限制來判斷流量是否過載,當請求並發數超過指定上限後,後續請求將被排隊並根據請求優先順序進行調度。
適用情境
該策略基於並發數限制來判斷流量是否過載,適用於應用並發度限制,同時具有明顯流量峰穀特徵的服務。
可控速率下的請求優先順序調度
通過配置QuotaSchedulingPolicy,以指定的流量速率來判斷流量是否過載,當請求並發數超過指定上限後,後續請求將被排隊並根據請求優先順序進行調度。
適用情境
該策略基於流量速率限制來判斷流量是否過載,適用於應用請求流速限制,同時具有明顯流量峰穀特徵的服務。
基於延遲自適應的請求優先順序調度
通過配置AverageLatencySchedulingPolicy,將請求即時延遲與歷史平均值進行比較來檢測流量過載。當前請求延遲與歷史平均延遲差異過大時,將判斷系統發生過載,後續請求將被排隊並根據請求優先順序進行調度。
適用情境
當需要為請求進行排隊和優先順序調度,但難以確定服務可接受的最大請求速率或並發度時,可以通過此種自適應的方式對請求進行優先順序調度。