本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用輪詢模式重試
意圖
具有退避模式的重試會透明地重試因暫時性錯誤而失敗的作業,藉此改善應用程式的穩定性。
动机
在分散式架構中,暫時性錯誤可能是由於服務節流、暫時失去網路連線或暫時性服務無法使用所造成。自動重試因為這些暫時性錯誤而失敗的作業,可改善使用者體驗和應用程式彈性。但是,頻繁的重試可能會使網路頻寬過載並造成爭用。指數輪詢是一種技術,透過增加指定重試次數的等待時間來重試作業。
適用性
在以下情況下使用具有輪詢模式的重試:
-
您的服務經常限制請求以防止過載,從而導致429 個要求太多呼叫程序的例外狀況。
-
該網絡是分佈式架構中看不見的參與者,臨時網絡問題導致故障。
-
呼叫的服務暫時無法使用,導致失敗。頻繁的重試可能會導致服務降級,除非您使用此模式引入輪詢逾時。
問題和考量
-
冪等:如果對該方法的多次調用具有與對系統狀態的單次調用相同的效果,則該操作被認為是冪等的。當您使用帶有退避模式的重試時,操作應該是冪等的。否則,部分更新可能會損壞系統狀態。
-
網路頻寬:如果太多重試佔用網路頻寬,可能會發生服務降級,導致回應時間緩慢。
-
快速失敗的案例:對於非暫態錯誤,如果可以確定故障的原因,則通過使用斷路器圖案快速故障會更有效率。
-
退票率:引入指數輪詢可能會影響服務逾時,進而延長使用者的等待時間。
實作
高階架構
下圖說明服務 A 如何重試對服務 B 的呼叫,直到傳回成功的回應為止。如果服務 B 在嘗試幾次之後沒有返回成功的響應,則服務 A 可以停止重試並將失敗返回給其調用者。
實作使用AWS服務
下圖顯示了客戶支持平台上的票證處理工作流程。通過自動提升機票優先級來加快不滿意客戶的門票。該Ticket info
Lambda 函數提取工單詳細信息並調用Get sentiment
拉姆達函數。該Get sentiment
Lambda 函數通過將描述傳遞給檢查客戶情緒亞馬遜理解
如果打電話給Get sentiment
Lambda 函數失敗,工作流程會重試作業三次。AWS Step Functions允許您設定輪詢值,以允許指數輪詢。
在此範例中,最多可設定三次重試,增加倍數為 1.5 秒。如果第一次重試在 3 秒後發生,則第二次重試會在 3 x 1.5 秒 = 4.5 秒後進行,而第三次重試會在 4.5 x 1.5 秒 = 6.75 秒後進行。如果第三次重試失敗,工作流程會失敗。輪詢邏輯不需要任何自定義代碼-它是作為配置提供AWS Step Functions。
範本程式碼
下面的代碼顯示了具有退期模式的重試的實現。
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
相關內容
-
具有抖動的逾時、重試和輪詢
(亞馬遜建築商圖書館)