使用輪詢模式重試 - AWS 規定指引

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

使用輪詢模式重試

意圖

具有退避模式的重試會透明地重試因暫時性錯誤而失敗的作業,藉此改善應用程式的穩定性。

动机

在分散式架構中,暫時性錯誤可能是由於服務節流、暫時失去網路連線或暫時性服務無法使用所造成。自動重試因為這些暫時性錯誤而失敗的作業,可改善使用者體驗和應用程式彈性。但是,頻繁的重試可能會使網路頻寬過載並造成爭用。指數輪詢是一種技術,透過增加指定重試次數的等待時間來重試作業。

適用性

在以下情況下使用具有輪詢模式的重試:

  • 您的服務經常限制請求以防止過載,從而導致429 個要求太多呼叫程序的例外狀況。

  • 該網絡是分佈式架構中看不見的參與者,臨時網絡問題導致故障。

  • 呼叫的服務暫時無法使用,導致失敗。頻繁的重試可能會導致服務降級,除非您使用此模式引入輪詢逾時。

問題和考量

  • 冪等:如果對該方法的多次調用具有與對系統狀態的單次調用相同的效果,則該操作被認為是冪等的。當您使用帶有退避模式的重試時,操作應該是冪等的。否則,部分更新可能會損壞系統狀態。

  • 網路頻寬:如果太多重試佔用網路頻寬,可能會發生服務降級,導致回應時間緩慢。

  • 快速失敗的案例:對於非暫態錯誤,如果可以確定故障的原因,則通過使用斷路器圖案快速故障會更有效率。

  • 退票率:引入指數輪詢可能會影響服務逾時,進而延長使用者的等待時間。

實作

高階架構

下圖說明服務 A 如何重試對服務 B 的呼叫,直到傳回成功的回應為止。如果服務 B 在嘗試幾次之後沒有返回成功的響應,則服務 A 可以停止重試並將失敗返回給其調用者。

具有輪詢模式的重試的高級體系結構

實作使用AWS服務

下圖顯示了客戶支持平台上的票證處理工作流程。通過自動提升機票優先級來加快不滿意客戶的門票。該Ticket infoLambda 函數提取工單詳細信息並調用Get sentiment拉姆達函數。該Get sentimentLambda 函數通過將描述傳遞給檢查客戶情緒亞馬遜理解(未顯示)。

如果打電話給Get sentimentLambda 函數失敗,工作流程會重試作業三次。AWS Step Functions允許您設定輪詢值,以允許指數輪詢。

在此範例中,最多可設定三次重試,增加倍數為 1.5 秒。如果第一次重試在 3 秒後發生,則第二次重試會在 3 x 1.5 秒 = 4.5 秒後進行,而第三次重試會在 4.5 x 1.5 秒 = 6.75 秒後進行。如果第三次重試失敗,工作流程會失敗。輪詢邏輯不需要任何自定義代碼-它是作為配置提供AWS Step Functions。

使用輪詢模式重試AWS服務

範本程式碼

下面的代碼顯示了具有退期模式的重試的實現。

public async Task DoRetriesWithBackOff() { int retries = 0; bool retry; do { //Sample object for sending parameters var parameterObj = new InputParameter { SimulateTimeout = "false" }; var content = new StringContent(JsonConvert.SerializeObject(parameterObj), System.Text.Encoding.UTF8, "application/json"); var waitInMilliseconds = Convert.ToInt32((Math.Pow(2, retries) - 1) * 100); System.Threading.Thread.Sleep(waitInMilliseconds); var response = await _client.PostAsync(_baseURL, content); switch (response.StatusCode) { //Success case HttpStatusCode.OK: retry = false; Console.WriteLine(response.Content.ReadAsStringAsync().Result); break; //Throttling, timeouts case HttpStatusCode.TooManyRequests: case HttpStatusCode.GatewayTimeout: retry = true; break; //Some other error occured, so stop calling the API default: retry = false; break; } retries++; } while (retry && retries < MAX_RETRIES); }

GitHub儲存庫

如需此模式範例架構的完整實作,請參閱GitHub儲存庫位於https://github.com/aws-samples/retry-with-backoff

相關內容