本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
重試行為
注意
如需了解設定頁面配置或解譯 Support AWS SDKs和後續工具資料表的說明,請參閱 了解本指南的設定頁面。
重試行為包括有關 SDKs 如何嘗試從對 提出的請求所造成的失敗中復原的設定 AWS 服務。
使用下列項目設定此功能:
retry_mode
- 共用 AWSconfig
檔案設定AWS_RETRY_MODE
- 環境變數aws.retryMode
- JVM 系統屬性:僅限 Java/Kotlin-
指定 SDK 或開發人員工具嘗試重試的方式。
預設值:此值專屬於您的 SDK。檢查您的特定 SDK 指南或軟體開發套件的程式碼基礎,了解其預設
retry_mode
。有效值:
-
standard
– (建議) 建議的一組跨 AWS SDKs重試規則。此模式包含一組標準錯誤,這些錯誤會重試,並自動調整重試次數,以最大化可用性和穩定性。此模式可在多租用戶應用程式中安全使用。除非max_attempts
明確設定,否則使用此模式的預設嘗試次數上限為三次。 -
adaptive
– 重試模式,僅適用於特殊的使用案例,其中包含標準模式的功能,以及自動用戶端速率限制。除非您小心隔離應用程式租用戶,否則不建議多租用戶應用程式使用此重試模式。如需更多資訊,請參閱選擇 standard和 adaptive 重試模式。此模式是實驗性的,未來可能會變更行為。 -
legacy
– (不建議) 專屬於您的 SDK (請參閱您的特定 SDK 指南或軟體開發套件的程式碼基礎)。
-
max_attempts
- 共用 AWSconfig
檔案設定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
重試模式
建議您使用standard
重試模式,除非您確定您的用量更適合 adaptive
。
注意
adaptive
模式假設您根據後端服務可能調節請求的範圍來集區用戶端。如果您不這樣做,如果您對兩個資源使用相同的用戶端,則一個資源中的調節可能會延遲不相關的資源請求。
標準 | 自適應 |
---|---|
應用程式使用案例:全部。 | 應用程式使用案例:
|
支援中斷電路,以防止 SDK 在中斷期間重試。 | 支援中斷電路,以防止 SDK 在中斷期間重試。 |
在故障時使用抖動指數退避。 | 使用動態退避持續時間,嘗試將失敗請求的數量降至最低,以換取延遲增加的可能性。 |
永遠不要延遲第一次請求嘗試,只延遲重試。 | 可以調節或延遲初始請求嘗試。 |
如果您選擇使用 adaptive
模式,您的應用程式必須建構以每個可能節流的資源為中心的用戶端。在這種情況下,資源的調校會比只考慮每個資源更精細 AWS 服務。 AWS 服務 可以有額外的維度,用來調節請求。讓我們使用 Amazon DynamoDB 服務做為範例。DynamoDB 使用 AWS 區域 加上要存取的資料表來調節請求。這表示您的程式碼存取的一個資料表可能比其他資料表受到更多限制。如果您的程式碼使用相同的用戶端來存取所有資料表,且對其中一個資料表的請求受到調節,則適應性重試模式將降低所有資料表的請求率。您的程式碼應設計成每個Region-and-table對有一個用戶端。如果您在使用 adaptive
模式時遇到意外延遲,請參閱您正在使用服務的特定 AWS 文件指南。
重試模式實作詳細資訊
AWS SDKs 會使用字符儲存貯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和工具
下列 SDKs 支援本主題中所述的功能和設定。會記下任何部分例外狀況。 適用於 Java 的 AWS SDK 和 適用於 Kotlin 的 AWS SDK 僅支援任何 JVM 系統屬性設定。
SDK | 支援 | 備註或更多資訊 |
---|---|---|
AWS CLI v2 | 是 | |
適用於 C++ 的 SDK | 是 | |
SDK for Go V2 (1.x) |
是 | |
適用於 Go 的 SDK 1.x (V1) | 否 | |
適用於 Java 的 SDK 2.x | 是 | |
適用於 Java 的 SDK 1.x | 是 | JVM 系統屬性:使用 com.amazonaws.sdk.maxAttempts 而非 aws.maxAttempts ;使用 com.amazonaws.sdk.retryMode 而非 aws.retryMode 。 |
適用於 JavaScript 3.x 的 SDK | 是 | |
適用於 JavaScript 2.x 的 SDK | 否 | 支援重試次數上限、具有抖動的指數退避,以及用於重試退避之自訂方法的選項。 |
適用於 Kotlin 的 SDK | 是 | |
適用於 .NET 3.x 的 SDK | 是 | |
適用於 PHP 3.x 的 SDK | 是 | |
適用於 Python 的 SDK (Boto3) |
是 | |
適用於 Ruby 的 SDK 3.x | 是 | |
適用於 Rust 的 SDK | 是 | |
適用於 Swift 的 SDK | 是 | |
PowerShell 的工具 | 是 |