REL05-BP03 控制和限制重試呼叫
使用指數退避以在逐漸延長間隔後重試。引進抖動來隨機化這些重試間隔,並限制重試次數上限。
分散式軟體系統中的典型元件包括伺服器、負載平衡器、資料庫和 DNS 伺服器。在操作中,且操作可能失敗時,任何這些項目都可能開始產生錯誤。處理錯誤的預設技術是在用戶端實作重試。此技術可提高應用程式的可靠性和可用性。不過,如果用戶端在發生錯誤時立即嘗試重試失敗的操作,則網路很快就會因為新的和重試的請求而大規模地變得飽和,且每個請求都會爭奪網路頻寬。這可能會導致 重試暴風, 而該情況會降低服務的可用性。此模式可能會持續進行,直到整個系統出現故障為止。
若要避免這類情境,應該使用一般指數退避等 退避演算法 。指數退避演算法會逐漸降低執行重試的速率,從而避免網路擁塞。
許多開發套件和軟體程式庫 (包括來自 AWS 的程式庫) 都會實作這些演算法的一個版本。不過, 絕對不要假設退避演算法存在,請一律測試並驗證是否如此。
單靠簡單退避是不夠的,因為在分散式系統中,所有用戶端都可能會同時退避,從而建立重試呼叫的叢集。Marc Brooker 在其部落格文章 指數退避和抖動
最後,請務必設定 最大重試次數 或經過時間,之後重試就會失敗。AWS 開發套件預設情況下可實作此功能,並可以對其進行設定。對於堆疊中較低的服務,最大重試限制為零或一時可限制風險,但仍然有效,因為重試會委派給堆疊中較高的服務。
若未建立此最佳實務,暴露的風險等級: 高
實作指引
控制和限制重試呼叫。使用指數退避以在逐漸延長間隔後重試。引進抖動來隨機化這些重試間隔,並限制重試次數上限。
-
-
Amazon SDK 預設會實作重試和指數退避。呼叫自己的相依服務時,在相依性層中實作類似的邏輯。根據您的使用案例確定逾時時間以及何時停止重試。
-
-
資源
相關文件:
相關影片: