重試行為 - AWS SDKs 和 工具

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

重試行為

重試行為包括有關SDKs嘗試從失敗中復原的設定 AWS 服務.

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

retry_mode-共享 AWS config檔案設定
AWS_RETRY_MODE-環境變量
aws.retryMode-JVM 系統屬性:僅限爪哇/科特林

指定SDK或開發人員工具嘗試重試的方式。

預設值:此值特定於您的SDK. 檢查您的特定SDK指南或SDK代碼庫的默認值retry_mode

有效值

  • standard— (建議) 跨越建議的重試規則集 AWS SDKs。此模式包含重試的一組標準錯誤,並自動調整重試次數以最大化可用性和穩定性。此模式適用於多租戶應用程式。除非明確設定,否則使用此模式的預設最大嘗試次數max_attempts為三次。

  • adaptive— 僅適用於特殊使用案例的重試模式,其中包括標準模式的功能以及自動用戶端速率限制。除非您小心隔離應用程式承租人,否則不建議多租用戶應用程式使用此重試模式。如需更多資訊,請參閱選擇standard和adaptive重試模式。這種模式是實驗性的,它可能會改變 future 的行為。

  • legacy-(不推薦)特定於您的SDK(請檢查您的具體SDK指南或您SDK的代碼庫)。

max_attempts-共享 AWS config檔案設定
AWS_MAX_ATTEMPTS-環境變量
aws.maxAttempts-JVM 系統屬性:僅限爪哇/科特林

指定對請求進行的嘗試次數上限。

預設值:如果未指定此值,其預設值取決於retry_mode設定值:

  • 如果retry_modelegacy — 使用特定於您的默認值SDK(max_attempts默認情況下檢查您SDK的特定SDK指南或代碼庫)。

  • 如果retry_modestandard — 進行三次嘗試。

  • 如果retry_modeadaptive — 進行三次嘗試。

有效值:大於 0 的數字。

選擇standardadaptive重試模式

我們建議您使用standard重試模式,除非您確定您的使用方式更適合adaptive

注意

adaptive模式假設您根據後端服務可能會限制要求的範圍來共用用戶端。如果不這樣做,如果您對兩個資源使用相同的用戶端,則一個資源中的節流可能會延遲對不相關資源的請求。

標準 自适应
應用程式使用案例:全部。 應用程序用例:
  1. 對延遲不敏感。

  2. 用戶端只會存取單一資源,或者您提供邏輯,以便依據正在存取的服務資源來分別集區用戶端。

支持斷路,以防止在SDK中斷期間重試。 支持斷路,以防止在SDK中斷期間重試。
在發生故障時使用抖動的指數輪詢。 使用動態輪詢持續時間來嘗試將失敗的要求數目降到最低,以換取延遲增加的可能性。
永遠不會延遲第一次請求嘗試,只有重試。 可以限制或延遲初始請求嘗試。

如果您選擇使用adaptive模式,您的應用程式必須建構圍繞可能限制的每個資源所設計的用戶端。在這種情況下,資源比只是思考每個資源更精細地調整 AWS 服務. AWS 服務 可以有額外的維度,它們用來限制請求。讓我們以 Amazon DynamoDB 服務為例。DynamoDB 使用 AWS 區域 加上被訪問的表以節流請求。這意味著您的代碼正在訪問的一個表可能比其他表進行限制。如果您的程式碼使用相同的用戶端來存取所有資料表,且對其中一個資料表的要求會受到限制,則調適性重試模式會降低所有資料表的要求率。您的代碼應該設計為每個 R egion-and-table 對有一個客戶端。如果您在使用adaptive模式時遇到意外延遲,請參閱具體內容 AWS 您所使用之服務的文件指南。

重試模式實施細節

所以此 AWS SDKs利用令牌桶來決定是否應該重試請求以及(在adaptive重試模式的情況下)應該多快地發送請求。兩個令牌存儲桶由使用SDK:重試令牌存儲桶和請求率令牌存儲桶。

  • 重試 Token 值區可用來判斷是否SDK應暫時停用重試,以便在中斷期間保護上游和下游服務。在嘗試重試之前從存儲桶中獲取令牌,並在請求成功時將令牌返回到存儲桶。如果嘗試重試時值區為空,則不SDK會重試要求。

  • 請求率 Token 存儲桶僅用於adaptive重試模式,以確定發送請求的速率。在發送請求之前,會從存儲桶中獲取令牌,並根據服務返回的節流響應,以動態確定的速率將令牌返回到存儲桶。

以下是standardadaptive重試模式的高級偽代碼:

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可能有配置選項可以使請求失敗,而不是等待。值區中的 Token 會根據用戶端收到的節流回應數量,以動態決定的速率重新填入。

SendHTTPRequest:

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

RequestBookkeeping:

如果請求成功,令牌將添加到令牌存儲桶中。僅對於adaptive重試模式,請求率 Token 存儲桶的填充率會根據收到的響應類型更新。

Retryable:

此步驟會根據下列項目決定是否可以重試回應:

  • 狀HTTP態碼。

  • 從服務傳回的錯誤碼。

  • 連線錯誤,定義為未收到來自服務SDK的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支援本主題中描述的功能與設定。注意到任何部分例外情況。任何JVM系統屬性設定都受到 AWS SDK for Java 和 適用於 Kotlin 的 AWS SDK 只有。

SDK 支援 備註或更多資訊
AWS CLI V2
SDK對於 C ++
SDK對於轉到 V2(1.x)
SDK對於圍棋 1.x(V1)
SDK對於爪哇 2.x
SDK對於爪哇 1.x JVM系統屬性:使用com.amazonaws.sdk.maxAttempts代替aws.maxAttempts; 使用com.amazonaws.sdk.retryMode代替aws.retryMode.
SDK對於 JavaScript 3. x
SDK對於 JavaScript 2.x 支援最大重試次數、含抖動的指數輪詢,以及重試輪詢的自訂方法選項。
SDK對於科特林
SDK對於. NET3.x
SDK對於 PHP 3. x
SDK對於 Python(肉毒桿菌 3)
SDK對於紅寶石 3.x
SDK對於銹
SDK為斯威夫特
適用的工具 PowerShell