AWS 中的錯誤重試與指數退避 - AWS 一般參考

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS 中的錯誤重試與指數退避

網路上有許多元件 (例如 DNS 伺服器、交換器、負載平衡器和其他項目) 可以在指定請求之生命週期中的任何階段產生錯誤。一般在網路環境中處理這些錯誤回應的技術,就是在用戶端應用程式中實作重試。此技術可以提高應用程式的可靠性,並降低開發人員的營運成本。

每個 AWS 軟體開發套件會實作自動重試邏輯。AWS SDK for Java 會自動重試請求,而且您可以使用 ClientConfiguration 類別進行重試設定。例如,您可能想要關閉網頁的重試邏輯,讓請求的延遲降到最低,而且無需重試。使用 ClientConfiguration 類別並提供 maxErrorRetry 價值 0,即可關閉重試。

如果您使用的不是 AWS 軟體開發套件,請讓原本收到伺服器 (5xx) 或調節錯誤的請求重試。不過,用戶端錯誤 (4xx) 表示,您需要修訂請求更正問題,才能再試一次。

除了簡單的重試,每個AWS開發套件會實作指數退避演算法,以獲得更佳的流程控制。指數退避的背後概念是,對於連續錯誤回應,讓重試之間的等待時間漸進拉長。您應該實作延遲間隔上限,以及重試次數上限。延遲間隔上限和重試次數上限不一定是固定值,且應根據所執行的操作,以及像是網路延遲等其他本機因素來設定。

大多數指數退避演算法會使用抖動 (隨機延遲),以防止連續衝突。由於您在這些情況下並未嘗試避免這種衝突,因此不需要使用此亂數。不過,如果您使用並行用戶端,抖動有助於讓請求更快取得成功。如需詳細資訊,請參閱「指數退避和抖動」的相關部落格文章。

以下虛擬程式碼顯示,使用遞增延遲輪詢狀態的一種方式。

Do some asynchronous operation. retries = 0 DO wait for (2^retries * 100) milliseconds status = Get the result of the asynchronous operation. IF status = SUCCESS retry = false ELSE IF status = NOT_READY retry = true ELSE IF status = THROTTLED retry = true ELSE Some other error occurred, so stop calling the API. retry = false END IF retries = retries + 1 WHILE (retry AND (retries < MAX_RETRIES))