本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
重試行為
重試行為包括有關SDKs嘗試從失敗中復原的設定 AWS 服務.
使用下列項目設定此功能:
retry_mode
-共享 AWSconfig
檔案設定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
-共享 AWSconfig
檔案設定AWS_MAX_ATTEMPTS
-環境變量aws.maxAttempts
-JVM 系統屬性:僅限爪哇/科特林-
指定對請求進行的嘗試次數上限。
預設值:如果未指定此值,其預設值取決於
retry_mode
設定值:-
如果
retry_mode
是legacy
— 使用特定於您的默認值SDK(max_attempts
默認情況下檢查您SDK的特定SDK指南或代碼庫)。 -
如果
retry_mode
是standard
— 進行三次嘗試。 -
如果
retry_mode
是adaptive
— 進行三次嘗試。
有效值:大於 0 的數字。
-
選擇standard
和adaptive
重試模式
我們建議您使用standard
重試模式,除非您確定您的使用方式更適合adaptive
。
注意
此adaptive
模式假設您根據後端服務可能會限制要求的範圍來共用用戶端。如果不這樣做,如果您對兩個資源使用相同的用戶端,則一個資源中的節流可能會延遲對不相關資源的請求。
標準 | 自适应 |
---|---|
應用程式使用案例:全部。 | 應用程序用例:
|
支持斷路,以防止在SDK中斷期間重試。 | 支持斷路,以防止在SDK中斷期間重試。 |
在發生故障時使用抖動的指數輪詢。 | 使用動態輪詢持續時間來嘗試將失敗的要求數目降到最低,以換取延遲增加的可能性。 |
永遠不會延遲第一次請求嘗試,只有重試。 | 可以限制或延遲初始請求嘗試。 |
如果您選擇使用adaptive
模式,您的應用程式必須建構圍繞可能限制的每個資源所設計的用戶端。在這種情況下,資源比只是思考每個資源更精細地調整 AWS 服務. AWS 服務 可以有額外的維度,它們用來限制請求。讓我們以 Amazon DynamoDB 服務為例。DynamoDB 使用 AWS 區域 加上被訪問的表以節流請求。這意味著您的代碼正在訪問的一個表可能比其他表進行限制。如果您的程式碼使用相同的用戶端來存取所有資料表,且對其中一個資料表的要求會受到限制,則調適性重試模式會降低所有資料表的要求率。您的代碼應該設計為每個 R egion-and-table 對有一個客戶端。如果您在使用adaptive
模式時遇到意外延遲,請參閱具體內容 AWS 您所使用之服務的文件指南。
重試模式實施細節
所以此 AWS SDKs利用令牌桶adaptive
重試模式的情況下)應該多快地發送請求。兩個令牌存儲桶由使用SDK:重試令牌存儲桶和請求率令牌存儲桶。
-
重試 Token 值區可用來判斷是否SDK應暫時停用重試,以便在中斷期間保護上游和下游服務。在嘗試重試之前從存儲桶中獲取令牌,並在請求成功時將令牌返回到存儲桶。如果嘗試重試時值區為空,則不SDK會重試要求。
-
請求率 Token 存儲桶僅用於
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可能有配置選項可以使請求失敗,而不是等待。值區中的 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 | 是 |