本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
REL05-BP03 控制和限制重試呼叫
使用指數退避,在每次重試之間的間隔逐漸拉長後重試請求。在重試之間導入抖動以隨機化重試間隔。限制重試次數上限。
預期結果:分散式軟體系統中的典型元件包括伺服器、負載平衡器、資料庫和DNS伺服器。在正常操作期間,這些元件可以回應具有暫時性或有限錯誤的請求,以及無論是否重試都將持續存在的錯誤。當用戶端向服務發出請求時,請求會取用資源,包括記憶體、執行緒、連線、連接埠,或任何其他有限的資源。控制和限制重試是釋出資源並將資源耗用量降到最低的策略,可讓處於壓力下的系統元件不致不堪負荷。
當用戶端請求逾時或收到錯誤回應時,他們應該判斷是否要重試。如果執行重試,他們會使用具有抖動和最大重試值的指數退避來執行此作業。因此,後端服務和程序從負載中得到緩解並獲得自我修復的時間,進而更快速地復原和提供成功的請求服務。
常見的反模式:
-
在未新增指數退避、抖動和最大重試值的情況下實作重試。退避和抖動有助於避免因為在共用間隔內無意間進行協調重試而產生人為流量尖峰。
-
實作重試,而不測試其效果,或假設重試已內建到 中,SDK而不測試重試案例。
-
未能了解從相依性發布的錯誤代碼,因而重試了所有錯誤,包括有明確原因指出缺少權限的錯誤、組態錯誤,或其他預期必須要手動干預才能解決的狀況。
-
未解決可觀測性實務,包括對重複的服務失敗進行監控和提醒,使基礎問題廣為人知並且可以解決。
-
在內建或第三方重試功能堪用時,開發自訂重試機制。
-
以複合重試的方式在應用程式堆疊的多個層級重試,會嘗試在重試風暴中進一步耗用資源。請務必了解這些錯誤如何影響您所依賴的應用程式,然後僅在一個層級實作重試。
-
重試不是等冪的服務呼叫,導致非預期的副作用,例如重複的結果。
建立此最佳實務的優勢:重試可協助用戶端在請求失敗時獲得所需的結果,但也會耗用更多伺服器的時間來取得他們想要的成功回應。若失敗是罕見或暫時性的,重試可以有效運作。若失敗是由資源超載引起的,重試可能會使情況變得更糟。在用戶端重試中新增具有抖動的指數退避,可讓伺服器在資源超載導致失敗時進行復原。抖動可避免將請求對應到尖峰,而退避會減少將重試新增至正常請求負載所造成的負載上升。最後,請務必設定最大重試次數或經過時間,以避免建立會產生亞穩態失敗的積存。
未建立此最佳實務時的曝險等級:高
實作指引
控制和限制重試呼叫。使用指數退避以在逐漸延長間隔後重試。引進抖動來隨機化重試間隔,並限制重試次數上限。
有些 AWS SDKs依預設會實作重試和指數退避。在工作負載中適用的情況下,使用這些內建 AWS 實作。在呼叫等冪的服務時,以及重試可改善用戶端可用性時,在您的工作負載中實作類似的邏輯。根據您的使用案例確定逾時時間以及何時停止重試。為那些重試使用案例建置和模擬演練測試情境。
實作步驟
資源
相關的最佳實務:
相關文件:
相關範例:
相關影片:
相關工具: