

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

# 重試行為
<a name="feature-retry-behavior"></a>

**注意**  
如需了解設定頁面配置或解譯以下 **Support AWS SDKs和工具**資料表的說明，請參閱 [了解本指南的設定頁面](settings-reference.md#settingsPages)。

重試行為包括 SDKs 如何嘗試從對 提出的請求所產生的失敗中復原的設定 AWS 服務。

使用下列項目設定此功能：

**`retry_mode` - 共用 AWS `config`檔案設定`AWS_RETRY_MODE` - 環境變數`aws.retryMode` - JVM 系統屬性：僅限 Java/Kotlin**  
指定 SDK 或開發人員工具嘗試重試的方式。  
**預設值：**此值專屬於您的 SDK。檢查您的特定軟體開發套件指南或軟體開發套件的程式碼庫，了解其預設的 `retry_mode`。  
**有效值**：  
+ `standard` – （建議） 建議的一組跨 AWS SDKs 重試規則。此模式包含一組標準錯誤，這些錯誤會重試，並自動調整重試次數，以最大化可用性和穩定性。此模式可在多租用戶應用程式中安全使用。除非`max_attempts`明確設定，否則使用此模式的預設嘗試次數上限為三次。
+ `adaptive` – 一種重試模式，僅適用於專門的使用案例，其中包含標準模式的功能以及自動用戶端速率限制。除非您小心隔離應用程式租用戶，否則不建議多租用戶應用程式使用此重試模式。如需詳細資訊，請參閱[選擇 `standard`和 `adaptive` 重試模式](#standardvsadaptive)。此模式是實驗性的，未來可能會變更行為。
+ `legacy` – （不建議） 專屬於您的 SDK （請參閱您的特定 SDK 指南或軟體開發套件的程式碼庫）。

**`max_attempts` - 共用 AWS `config`檔案設定`AWS_MAX_ATTEMPTS` - 環境變數`aws.maxAttempts` - JVM 系統屬性：僅限 Java/Kotlin**  
指定對請求進行的最大嘗試次數。  
**預設值：**如果未指定此值，其預設值取決於 `retry_mode`設定的值：  
+ 如果 `retry_mode`為 `legacy`- 使用 SDK 特有的預設值 （請參閱特定 SDK 指南或 SDK 的程式碼基底以取得`max_attempts`預設值）。
+ 如果 `retry_mode`是 `standard` – 進行三次嘗試。
+ 如果 `retry_mode`是 `adaptive` – 進行三次嘗試。
**有效值：**大於 0 的數字。

## 選擇 `standard`和 `adaptive` 重試模式
<a name="standardvsadaptive"></a>

建議您使用`standard`重試模式，除非您確定您的用量更適合 `adaptive`。

**注意**  
`adaptive` 模式假設您要根據後端服務可能調節請求的範圍來集區用戶端。如果您不這樣做，如果您對兩個資源使用相同的用戶端，則一個資源中的調節可能會延遲對不相關資源的請求。


| 標準 | 自適應 | 
| --- | --- | 
| 應用程式使用案例：全部。 | 應用程式使用案例：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/sdkref/latest/guide/feature-retry-behavior.html)  | 
| 支援中斷電路，以防止 SDK 在中斷期間重試。 | 支援中斷電路，以防止 SDK 在中斷期間重試。 | 
| 在失敗時使用抖動指數退避。 | 使用動態退避持續時間來嘗試將失敗的請求數量降至最低，以換取增加延遲的可能性。 | 
| 永遠不要延遲第一次的請求嘗試，只延遲重試。 | 可以調節或延遲初始請求嘗試。 | 

如果您選擇使用 `adaptive` 模式，您的應用程式必須建構以每個可能節流的資源為中心的用戶端。在這種情況下，資源的微調比只考慮每個資源更精細 AWS 服務。 AWS 服務 可以具有用於調節請求的其他維度。讓我們使用 Amazon DynamoDB 服務做為範例。DynamoDB 使用 AWS 區域 加上要存取的資料表來調節請求。這表示您的程式碼存取的一個資料表可能會受到比其他資料表更多的調節。如果您的程式碼使用相同的用戶端存取所有資料表，且對其中一個資料表的請求受到調節，則適應性重試模式將降低所有資料表的請求率。您的程式碼應設計成每個Region-and-table對有一個用戶端。如果您在使用 `adaptive` 模式時遇到意外延遲，請參閱您正在使用服務的特定 AWS 文件指南。

## 重試模式實作詳細資訊
<a name="standardvsadaptiveimplementation"></a>

 AWS SDKs 會使用[字符儲存貯](https://en.wikipedia.org/wiki/Token_bucket)體來決定是否應重試請求，以及 （在`adaptive`重試模式下） 應傳送請求的速度。軟體開發套件會使用兩個字符儲存貯體：重試字符儲存貯體和請求速率字符儲存貯體。
+ 重試字符儲存貯體用於判斷 SDK 是否應暫時停用重試，以便在中斷期間保護上游和下游服務。在嘗試重試之前，會從儲存貯體取得權杖，並在請求成功時將權杖傳回至儲存貯體。如果嘗試重試時儲存貯體是空的，則 SDK 不會重試請求。
+ 請求率字符儲存貯體僅用於`adaptive`重試模式，以判斷傳送請求的速率。在傳送請求之前，會從儲存貯體取得字符，並根據服務傳回的限流回應，以動態決定的速率將字符傳回至儲存貯體。

以下是 `standard`和 `adaptive` 重試模式的高階虛擬程式碼：

```
MakeSDKRequest() {
  attempts = 0
  loop {
    GetSendToken()
    response = SendHTTPRequest()
    RequestBookkeeping(response)
    if not Retryable(response)
      return response
    attempts += 1
    if attempts >= MAX_ATTEMPTS:
      return response
    if not HasRetryQuota(response)
      return response
    delay = ExponentialBackoff(attempts)
    sleep(delay)
  }
}
```

以下是有關虛擬程式碼中所用元件的更多詳細資訊：

**`GetSendToken`:**

此步驟僅用於`adaptive`重試模式。此步驟會從請求率字符儲存貯體取得字符。如果字符不可用，它會等待一個字符變成可用。您的 SDK 可能有組態選項，可讓請求失敗，而不是等待。儲存貯體中的字符會根據用戶端收到的限流回應數量，以動態決定的速率重新填充。

**`SendHTTPRequest`:**

此步驟會將請求傳送至 AWS。 AWS SDKs使用 HTTP 程式庫，該程式庫使用連線集區在提出 HTTP 請求時重複使用現有的連線。一般而言，如果請求因限流錯誤而失敗，但請求因暫時性錯誤而失敗，則會重複使用連線。

**`RequestBookkeeping`:**

如果請求成功，權杖會新增至權杖儲存貯體。僅針對`adaptive`重試模式，請求速率字符儲存貯體的填充速率會根據收到的回應類型更新。

**`Retryable`:**

 此步驟會根據下列項目決定是否可以重試回應：
+ HTTP 狀態碼 。
+ 從服務傳回的錯誤碼。
+ 連線錯誤，定義為軟體開發套件收到的任何錯誤，其中未收到服務的 HTTP 回應。

暫時性錯誤 (HTTP 狀態碼 400、408、500、502、503 和 504) 和限流錯誤 (HTTP 狀態碼 400、403、429、502、503 和 509) 都可以重試。SDK 重試行為是結合錯誤代碼或服務的其他資料來決定。

**`MAX_ATTEMPTS`:**

 除非由 `retry_mode` 設定覆寫，否則預設的嘗試次數上限會由 `max_attempts`設定設定。

**`HasRetryQuota`**

此步驟會從重試權杖儲存貯體取得權杖。如果重試權杖儲存貯體是空的，則不會重試請求。

**`ExponentialBackoff`**

 對於可以重試的錯誤，系統會使用截斷的指數退避來計算重試延遲。SDKs使用截斷的二進位指數退避與抖動。下列演算法顯示如何為請求 的回應定義睡眠時間，以秒為單位`i`：

```
seconds_to_sleep_i = min(b*r^i, MAX_BACKOFF)
```

在上述演算法中，適用下列值：

`b = random number within the range of: 0 <= b <= 1`

`r = 2`

`MAX_BACKOFF = 20 seconds` 適用於大多數 SDKs。請參閱您的特定 SDK 指南或原始程式碼進行確認。

## 支援 AWS SDKs和工具
<a name="feature-retry-behavior-sdk-compat"></a>

下列 SDKs 支援本主題中所述的功能和設定。會記下任何部分例外狀況。 適用於 Java 的 AWS SDK 和 適用於 Kotlin 的 AWS SDK 僅支援任何 JVM 系統屬性設定。


| SDK | 支援 | 備註或更多資訊 | 
| --- | --- | --- | 
| [AWS CLI  ](https://docs.aws.amazon.com/cli/latest/userguide/) v2 | 是 |  | 
| [適用於 C\+\+ 的 SDK](https://docs.aws.amazon.com/sdk-for-cpp/latest/developer-guide/) | 是 |  | 
| [適用於 Go V2 的 SDK (1.x)](https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/) | 是 |  | 
| [適用於 Go 的 SDK 1.x (V1)](https://docs.aws.amazon.com/sdk-for-go/latest/developer-guide/) | 否 |  | 
| [適用於 Java 的 SDK 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/) | 是 |  | 
| [適用於 Java 的 SDK 1.x](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/) | 是 | JVM 系統屬性：使用 com.amazonaws.sdk.maxAttempts而非 aws.maxAttempts；使用 com.amazonaws.sdk.retryMode而非 aws.retryMode。 | 
| [適用於 JavaScript 3.x 的 SDK](https://docs.aws.amazon.com/sdk-for-javascript/latest/developer-guide/) | 是 |  | 
| [適用於 JavaScript 2.x 的 SDK](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/) | 否 | 支援重試次數上限、具有抖動的指數退避，以及用於重試退避的自訂方法選項。 | 
| [適用於 Kotlin 的 SDK](https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/) | 是 |  | 
| [適用於 .NET 4.x 的 SDK](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/) | 是 |  | 
| [適用於 .NET 3.x 的 SDK](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/) | 是 |  | 
| [適用於 PHP 的 SDK 3.x](https://docs.aws.amazon.com/sdk-for-php/latest/developer-guide/) | 是 |  | 
| [適用於 Python 的 SDK (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html) | 是 |  | 
| [適用於 Ruby 的 SDK 3.x](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/) | 是 |  | 
| [適用於 Rust 的 SDK](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/) | 是 |  | 
| [適用於 Swift 的 SDK](https://docs.aws.amazon.com/sdk-for-swift/latest/developer-guide/) | 是 |  | 
| [PowerShell V5 的工具](https://docs.aws.amazon.com/powershell/latest/userguide/) | 是 |  | 
| [PowerShell V4 的工具](https://docs.aws.amazon.com/powershell/v4/userguide/) | 是 |  | 