重試行為 - AWS 軟體開發套件和工具

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

重試行為

重試行為包括有關 SDK 如何嘗試從發出請求而導致的失敗中恢復的設置。 AWS 服務

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

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

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

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

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

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

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

有效值:大於 0 的數字。

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

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

預設值:legacy是預設的重試策略。

有效值

  • legacy— 特定於您的 SDK(請查看您的特定 SDK 指南或 SDK 的代碼庫)。

  • standard— 跨 AWS SDK 的標準重試規則集。此模式包含重試的一組標準錯誤,並支援重試配額。除非明確設定,否則使用此模式的預設最大嘗試次數max_attempts為三次。

  • adaptive— 實驗性重試模式,其中包含標準模式的功能,但包含自動用戶端節流。由於此模式是實驗性的,因此 future 可能會改變行為。

以下是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 客戶端可配置為快速失敗請求或阻止,直到令牌變為可用。

客戶端速率限制是一種算法,最初允許以任何速率發出請求,最高可達令牌限額。但是,在偵測到節流回應之後,用戶端會受到相應 rate-of-request 的限制。如果收到成功的回應,令牌額度也會相應地增加。

使用自適應速率限制,SDK 可以減慢傳送要求的速率,以便更好地容納的 AWS 服務容量。

SendHTTPRequest:

大多數 AWS SDK 使用使用連接池的 HTTP 庫,以便您可以在發出 HTTP 請求時重複使用現有連接。一般而言,由於節流錯誤而重試要求時,會重複使用連線。由於暫時性錯誤而重試時,請求不會重複使用。

RequestBookkeeping:

如果請求成功,則應更新重試配額。僅針對adaptive重試模式,state 變數maxsendrate會根據收到的回應類型進行更新。

Retryable:

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

  • HTTP 狀態碼 。

  • 從服務傳回的錯誤碼。

  • 連接錯誤,定義為 SDK 收到的任何錯誤,其中未收到來自服務的 HTTP 響應。

暫時性錯誤 (HTTP 狀態碼 400、408、500、502、503 和 504) 和節流錯誤 (HTTP 狀態碼 400、403、429、502、503 和 509) 都可能會重試。SDK 重試行為是與服務中的錯誤代碼或其他數據一起確定的。

MAX_ATTEMPTS:

config檔案設定或環境變數指定。

HasRetryQuota

此步驟通過要求重試配額存儲桶中提供令牌來限制重試請求。重試配額值區是一種機制,可防止不太可能成功的重試。這些配額依賴於 SDK,通常依賴於用戶端,有時甚至依賴於服務端點。當請求因各種原因而失敗時,可用的重試配額令牌將被刪除,並在成功時進行補充。當沒有令牌保留時,重試循環將退出。

ExponentialBackoff

對於可重試的錯誤,會使用截斷的指數輪詢來計算重試延遲。SDK 使用具有抖動的截斷二進制指數輪詢。下列演算法顯示如何針對要求回應定義睡眠的時間量 (以秒為單位)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適用於大多數 SDK。請參閱您的特定 SDK 指南或原始碼以進行確認。

與 AWS 開發套件的相容性

下列 SDK 支援本主題中描述的功能和設定。注意到任何部分例外情況。和唯一支援任何 JVM 系統屬 AWS SDK for Java 性設 適用於 Kotlin 的 AWS SDK 定。