

# REL05-BP03 控制和限制重試呼叫
<a name="rel_mitigate_interaction_failure_limit_retries"></a>

使用指數退避，在每次重試之間的間隔逐漸拉長後重試請求。在重試之間導入抖動以隨機化重試間隔。限制重試次數上限。

 **預期結果：**分散式軟體系統中的典型元件包括伺服器、負載平衡器、資料庫和DNS伺服器。在正常操作期間，這些元件可以回應具有暫時性或有限錯誤的請求，以及無論是否重試都將持續存在的錯誤。當用戶端向服務發出請求時，請求會取用資源，包括記憶體、執行緒、連線、連接埠，或任何其他有限的資源。控制和限制重試是釋出資源並將資源耗用量降到最低的策略，可讓處於壓力下的系統元件不致不堪負荷。

 當用戶端請求逾時或收到錯誤回應時，他們應該判斷是否要重試。如果執行重試，他們會使用具有抖動和最大重試值的指數退避來執行此作業。因此，後端服務和程序從負載中得到緩解並獲得自我修復的時間，進而更快速地復原和提供成功的請求服務。

 **常見的反模式：**
+  在未新增指數退避、抖動和最大重試值的情況下實作重試。退避和抖動有助於避免因為在共用間隔內無意間進行協調重試而產生人為流量尖峰。
+  實作重試，而不測試其效果，或假設重試已內建到 中，SDK而不測試重試案例。
+  未能了解從相依性發布的錯誤代碼，因而重試了所有錯誤，包括有明確原因指出缺少權限的錯誤、組態錯誤，或其他預期必須要手動干預才能解決的狀況。
+  未解決可觀測性實務，包括對重複的服務失敗進行監控和提醒，使基礎問題廣為人知並且可以解決。
+  在內建或第三方重試功能堪用時，開發自訂重試機制。
+  以複合重試的方式在應用程式堆疊的多個層級重試，會嘗試在重試風暴中進一步耗用資源。請務必了解這些錯誤如何影響您所依賴的應用程式，然後僅在一個層級實作重試。
+  重試不是等冪的服務呼叫，導致非預期的副作用，例如重複的結果。

 **建立此最佳實務的優勢：**重試可協助用戶端在請求失敗時獲得所需的結果，但也會耗用更多伺服器的時間來取得他們想要的成功回應。若失敗是罕見或暫時性的，重試可以有效運作。若失敗是由資源超載引起的，重試可能會使情況變得更糟。在用戶端重試中新增具有抖動的指數退避，可讓伺服器在資源超載導致失敗時進行復原。抖動可避免將請求對應到尖峰，而退避會減少將重試新增至正常請求負載所造成的負載上升。最後，請務必設定最大重試次數或經過時間，以避免建立會產生亞穩態失敗的積存。

 **未建立此最佳實務時的曝險等級：**高 

## 實作指引
<a name="implementation-guidance"></a>

 控制和限制重試呼叫。使用指數退避以在逐漸延長間隔後重試。引進抖動來隨機化重試間隔，並限制重試次數上限。

 有些 AWS SDKs依預設會實作重試和指數退避。在工作負載中適用的情況下，使用這些內建 AWS 實作。在呼叫等冪的服務時，以及重試可改善用戶端可用性時，在您的工作負載中實作類似的邏輯。根據您的使用案例確定逾時時間以及何時停止重試。為那些重試使用案例建置和模擬演練測試情境。

## 實作步驟
<a name="implementation-steps"></a>
+  確認應用程式堆疊中的最佳層級，以針對您應用程式所依賴的服務實作重試。
+  請注意，現有的 SDKs 會針對您選擇的語言實作經過驗證的重試策略，並具有指數退避和抖動，並且比編寫您自己的重試實作更有利。
+  在實作重試之前，請確認[服務是冪等的](https://aws.amazon.com/builders-library/making-retries-safe-with-idempotent-APIs/)。實作重試後，請務必在生產環境中加以測試和定期模擬演練。
+  呼叫 AWS 服務 時APIs，請使用 [AWS SDKs](https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html)和 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-retries.html)並了解重試組態選項。確認預設值是否適用於您的使用案例，並視需要進行測試和調整。

## 資源
<a name="resources"></a>

 **相關的最佳實務：**
+  [REL04-BP04 讓變異操作冪等](rel_prevent_interaction_failure_idempotent.md) 
+  [REL05-BP02 限流請求](rel_mitigate_interaction_failure_throttle_requests.md) 
+  [REL05-BP04 快速檢錯和限制佇列](rel_mitigate_interaction_failure_fail_fast.md) 
+  [REL05-BP05 設定用戶端逾時](rel_mitigate_interaction_failure_client_timeouts.md) 
+  [REL11-BP01 監控工作負載的所有元件以偵測故障](rel_withstand_component_failures_monitoring_health.md) 

 **相關文件：**
+  [中的錯誤重試和指數退避 AWS](https://docs.aws.amazon.com/general/latest/gr/api-retries.html) 
+  [Amazon 建置者資料中心：逾時、重試、退避與抖動](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/) 
+ [指數退避和抖動](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)
+ [ 以無能方式確保重試安全 APIs ](https://aws.amazon.com/builders-library/making-retries-safe-with-idempotent-APIs/)

 **相關範例：**
+ [Spring 重試](https://github.com/spring-projects/spring-retry)
+ [Resilience4j 重試](https://resilience4j.readme.io/docs/retry)

 **相關影片：**
+  [重試、退避和抖動： AWS re：Invent 2019：介紹 Amazon Builders 程式庫 （DOP328）](https://youtu.be/sKRdemSirDM?t=1884) 

 **相關工具：**
+ [AWS SDKs 和 工具：重試行為 ](https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html)
+ [AWS Command Line Interface： AWS CLI 重試 ](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-retries.html)