共用方式為


應用程式復原模式

提示

此內容摘錄自《建構適用於 Azure 的雲端原生 .NET 應用程式》電子書,您可以在 .NET Docs 找到此電子書,或免費下載可離線閱讀的 PDF。

Cloud Native .NET apps for Azure eBook cover thumbnail.

第一道防線是應用程式復原。

雖然您可以投入相當長的時間撰寫自己的復原架構,但這類產品已經存在。 Polly 是完整的 .NET 復原和暫時性錯誤處理程式庫,可讓開發人員以流暢且安全執行緒的方式表達復原原則。 Polly 是以使用 .NET Framework 或 .NET 7 建置的應用程式為目標。 下表描述 Polly Library 中提供的復原功能,稱為 policies。 這些功能可以個別套用或群組在一起。

原則 體驗
重試 在指定的作業上設定重試作業。
斷路器 當錯誤超過設定的閾值時,封鎖針對預先定義期間要求的作業
Timeout 限制呼叫端可以等候回應的持續時間。
隔艙 將動作限制為固定大小的資源集區,以防止失敗的呼叫淹沒資源。
Cache 自動儲存回應。
後援 定義失敗時的結構化行為。

請注意在上圖中,復原原則如何套用至要求訊息,無論是來自外部用戶端還是後端服務。 目標是補償可能暫時無法使用的服務要求。 這些短期中斷通常會以下表所示的 HTTP 狀態碼來表示。

HTTP 狀態碼 原因
404 找不到
408 要求逾時
429 太多要求 (您很可能已節流)
502 錯誤的閘道
503 服務無法使用
504 閘道逾時

問題:您是否重試 HTTP 狀態碼 403 - 禁止? 否。 在這裡系統會正常運作,但是會通知呼叫端,而呼叫端無權執行要求的作業。 請務必小心,只重試失敗所造成的作業。

如第 1 章所建議,建構雲端原生應用程式的 Microsoft 開發人員應以 .NET 平台為目標。 2.1 版引進了 HTTPClientFactory 程式庫,用於建立 HTTP 用戶端執行個體,以便與 URL 型資源互動。 取代原始 HTTPClient 類別,Factory 類別支援許多增強功能,其中一個功能是與 Polly 復原程式庫緊密整合。 透過這個類別,您可以輕鬆地在應用程式啟動類別中定義復原原則,以處理部分失敗和連線問題。

接下來,讓我們展開重試和斷路器模式。

重試模式

在分散式雲端原生環境中,服務與雲端資源的呼叫可能會因為暫時性 (短期) 失敗而失敗,這通常會在短暫的時間之後自行更正。 實作重試策略可協助雲端原生服務減輕這些案例。

重試模式可讓服務重試失敗的要求作業 (可設定的) 次數,具有指數遞增的等候時間。 圖 6-2 顯示作用中的重試。

Retry pattern in action

圖 6-2. 作用中的重試模式

在上圖中,已針對要求作業實作重試模式。 其設定為在失敗前最多允許四次重試,具有從兩秒開始的輪詢間隔 (等候時間),每次後續嘗試都會指數加倍。

  • 第一個叫用失敗,並傳回 HTTP 狀態碼 500。 應用程式會等候兩秒,然後重試呼叫。
  • 第二個叫用也失敗,並傳回 HTTP 狀態碼 500。 應用程式現在會將輪詢間隔加倍至四秒,然後重試呼叫。
  • 最後,第三個呼叫成功。
  • 在此案例中,重試作業在呼叫失敗之前,最多會嘗試四次重試,同時將輪詢持續時間加倍。
  • 如果第 4 次重試嘗試失敗,系統會叫用後援原則以正常處理問題。

請務必在重試呼叫之前增加輪詢期間,以允許服務時間自行更正。 最佳做法是實作指數遞增輪詢 (每次重試期間加倍) 以允許適當的更正時間。

斷路器模式

雖然重試模式有助於挽救部分失敗中糾纏的要求,但在某些情況下,可能會因為非預期的事件而造成失敗,需要較長的時間才能解決。 這些錯誤的嚴重性可能從失去部分連線到服務完全失敗。 在這些情況下,讓應用程式持續重試不太可能會成功的作業可能毫無意義。

讓情況變得更糟的是,在非回應服務上執行持續重試作業,可以將您移至自我強加的阻斷服務案例,您以持續呼叫充斥服務時會耗盡記憶體、執行緒和資料庫連線等資源,而導致使用相同資源的系統其不相關部分也失敗。

在這些情況下,最好讓作業立即失敗,而且只有在服務可能成功時才嘗試叫用服務。

斷路器模式可防止應用程式重複嘗試執行很可能會失敗的作業。 在預先定義的失敗呼叫次數之後,會封鎖服務的所有流量。 會定期允許試用呼叫判斷錯誤是否已解決。 圖 6-3 顯示作用中的斷路器模式。

Circuit breaker pattern in action

圖 6-3. 作用中的斷路器模式

在上圖中,斷路器模式已新增至原始重試模式。 請注意,在 100 個失敗的要求之後,斷路器會開啟,且不再允許呼叫服務。 CheckCircuit 值設定為 30 秒,指定程式庫允許一個要求繼續服務的頻率。 如果該呼叫成功,線路會關閉,且服務再次可供流量使用。

請記住,斷路器模式的意圖與重試模式的意圖不同。 重試模式會在預期作業會成功的情況下,讓應用程式重試作業。 斷路器模式可防止應用程式執行可能失敗的作業。 一般而言,應用程式將會結合這兩種模式,使用重試模式透過斷路器來叫用作業。

測試復原

測試復原的方式不一定與測試應用程式功能的方式相同 (藉由執行單元測試、整合測試等等)。 相反地,您必須測試端對端工作負載在失敗情況下的執行方式,這只會間歇性發生。 例如:藉由損毀程序、過期的憑證、使相依服務無法使用等方式插入失敗。混亂式之類的架構可用於這類混亂測試。

應用程式復原是處理有問題的要求作業的必要項目。 但是,這只是故事的一半。 接下來,我們將討論 Azure 雲端中可用的復原功能。