View a markdown version of this page

重試行為 - AWS SDKs和工具

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

重試行為

重要

此頁面所述的行為需要選擇加入,直到成為預設行為為止。AWS_NEW_RETRIES_2026=true 在您的環境中設定 。如果沒有此設定,您的 SDK 會使用 2026 年之前的重試行為,這在退避時間、重試配額成本和服務特定預設值方面有所不同。如需詳細資訊,請參閱公告部落格文章

當請求因暫時性錯誤或限流而 AWS 服務 失敗時,軟體開發套件可以自動重試請求。此頁面說明如何設定重試,以及如何在內部運作。

  • 設定重試:選擇重試模式、設定最大嘗試次數,以及了解組態優先順序。

  • 重試的運作方式:重試流程、錯誤分類、退避公式、重試配額機制和服務特定行為。

設定重試

您可以控制開發套件使用的重試策略,以及重試次數。

選擇重試模式

重試模式會決定 SDK 在請求失敗時的行為。有三種模式可用:標準適應性和傳統

標準 自適應 傳統
重試配額 依 SDK 而異
可以延遲初始請求
Error-type-specific 退避 依 SDK 而異
跨 SDKs標準化
建議 所有工作負載的預設值 單一資源、調節繁重、延遲容錯 僅限回溯相容性

標準模式 (預設)

標準模式會使用指數退避搭配抖動重試失敗的請求。它會針對暫時性錯誤 (例如網路逾時) 使用較短的延遲,並針對限流錯誤 (例如 ) 使用較長的延遲ThrottlingException

標準模式包含重試配額,也就是權杖儲存貯體,可為每個重試扣除權杖,並在請求成功時補充權杖。當可用的字符用盡時,開發套件會傳回錯誤而不重試,因此您的應用程式會快速失敗,而不是等待不太可能成功的重試。這也有助於減少重試流量,以更快的速度解決服務中斷。在正常操作期間,配額會保持完整且沒有作用。重試配額永遠不會延遲或封鎖初始請求。只有重試會受到影響。如需詳細資訊,請參閱重試配額 (權杖儲存貯體)

除非您有特定理由選擇其他模式,否則請使用標準模式。

自適應模式

自適應模式包含標準模式中的所有項目,以及用戶端速率限制器。速率限制器會追蹤調節回應,並調整 SDK 傳送請求的速率。與標準模式不同,自適應模式可能會在偵測到限流時延遲或封鎖初始請求,而不只是重試。

速率限制器會依 SDK 用戶端執行個體運作。來自用戶端的所有請求都會共用相同的速率限制,無論其以哪個 API 操作或資源為目標。

何時使用自適應模式:

  • 您的用戶端以單一資源為目標 (例如,一個 DynamoDB 資料表),而且您預期會經常調節回應。這在呼叫大量單一 API 操作的自動化工作流程、批次處理器或 AI 工作負載中很常見。

  • 您希望軟體開發套件在服務發出限流訊號時自動減慢速度。

不使用自適應模式時:

  • 您的用戶端會將請求傳送至多個資源或為多個租用戶提供服務。調節一個資源會導致速率限制器拖慢來自該用戶端的所有請求,包括對不受影響資源的請求。

  • 您需要在初始請求時有可預測的延遲。

不建議將自適應模式作為一般預設值。

傳統模式

傳統模式是引進標準模式之前,每個 SDK 使用的重試行為。它不包含標準化的重試配額。某些 SDKs(例如 Java) 在舊版模式中有自己的重試配額實作,但軟體SDKs的行為不一致。如果沒有標準化配額,用戶端會在服務中斷期間繼續以完整速率重試。這會在不太可能成功的請求上連結執行緒和連線,同時新增可能會延遲服務復原的負載。

傳統模式會因 SDKs而異。重試計數、退避計時、可重試錯誤集和限流行為因語言而異。在 SDKs程式碼可能會有不同的行為。

提供:Java、Python、Ruby、PHP、C++、CLI

不適用於:.NET、Go、Kotlin、Rust、Swift、JavaScript

傳統模式為了回溯相容性而存在。如果您目前使用舊版模式,請切換到標準模式。

重試設定

下列設定控制重試行為。您可以透過環境變數共用組態檔案 (~/.aws/config) 或程式碼中的用戶端組態來設定它們。

設定 它控制的內容 環境變數 Config 檔案金鑰 預設
重試模式 要使用的重試策略 AWS_RETRY_MODE retry_mode standard
最大嘗試次數 嘗試次數總計,包括初始請求 AWS_MAX_ATTEMPTS max_attempts 3 (請參閱備註)

的最大嘗試次數值3表示 SDK 會提出一個初始請求,最多重試兩次。設定嘗試完全1停用重試次數上限。

注意

DynamoDB 和 DynamoDB Streams 用戶端預設為4最大嘗試次數。這些服務使用較短的基本退避延遲 (25 毫秒而非 50 毫秒),以符合其低延遲設定檔。額外嘗試可讓最後一次重試的最大退避與其他 服務相當。您可以使用上表中顯示的相同設定來覆寫此項目。

組態優先順序

當您在多個位置指定相同的設定時,軟體開發套件會使用下列優先順序來解析值,從最高到最低:

  1. 程式碼中的明確用戶端組態。直接在 SDK 用戶端或其組態物件上設定的值。

  2. 環境變數例如 AWS_RETRY_MODEAWS_MAX_ATTEMPTS

  3. 共用組態檔案中的 retry_modemax_attempts金鑰~/.aws/config

  4. SDK 預設。設定的內建預設值。

這遵循標準 AWS SDK 組態優先順序。在較高層級設定的值一律會覆寫在較低層級設定的值。例如,如果您在 retry_mode=standard中將 AWS_RETRY_MODE=adaptive設定為環境變數 和 ~/.aws/config,則 SDK 會使用自適應模式。

語言特定組態

此頁面 (retry_modemax_attempts) 所述的跨 SDK 設定適用於所有 SDKs。不過,在程式碼中設定重試的 API 會因語言而異。如需特定語言組態選項,例如自訂退避策略、其他可重試的錯誤,以及重試配額調校,請參閱開發套件的開發人員指南。

重試的運作方式

本節說明 AWS SDKs如何處理失敗的請求:哪些錯誤觸發重試、SDK 在嘗試之間等待多久,以及何時停止重試。

請求失敗時會發生什麼情況

當您透過 AWS SDK 進行 API 呼叫時,軟體開發套件會遵循以下順序:

  1. 僅限自適應模式軟體開發套件會檢查用戶端速率限制器。如果偵測到限流,軟體開發套件可能會在傳送請求之前延遲或封鎖請求。

  2. SDK 會將請求傳送至 AWS 服務 端點。

  3. 如果服務傳回成功回應,軟體開發套件會將結果傳回至您的程式碼。

  4. 如果請求失敗,開發套件會將錯誤分類為暫時性限流無法重試。請參閱 重試哪些錯誤

  5. 如果錯誤無法重試,軟體開發套件會立即將錯誤傳回至您的程式碼。未嘗試重試。

  6. 如果錯誤可重試,軟體開發套件會檢查是否已達到最大嘗試次數。若是如此,它會將錯誤傳回至您的程式碼。

  7. 軟體開發套件會檢查 重試配額 (權杖儲存貯體)。如果字符預算用盡,軟體開發套件不會重試並將錯誤傳回至您的程式碼。例外狀況:對於 長輪詢操作,軟體開發套件仍會在傳回錯誤之前套用退避延遲。

  8. SDK 會根據錯誤類型和重試嘗試次數來計算退避延遲。請參閱 軟體開發套件等待多久

  9. SDK 會等待計算的延遲,然後再次從步驟 2 傳送請求。

SDK 會重複此迴圈,直到請求成功、達到嘗試次數上限、耗盡重試配額,或發生無法重試的錯誤為止。整個程序都是自動的。您的應用程式會看到成功回應或最終錯誤。

重試哪些錯誤

開發套件會將每個失敗的請求分類為三個類別之一:暫時性、限流或無法重試。此分類會決定 SDK 是否重試請求,以及重試之前的等待時間。

分類是根據服務回應中的錯誤碼HTTP 狀態碼。例如,具有錯誤碼的 HTTP 400 RequestTimeout 會分類為暫時性並重試。具有 的 HTTP 400 ValidationException 被歸類為不可重試並立即傳回。

錯誤分類

暫時性錯誤會以短暫的基礎延遲 (50 毫秒) 重試:

錯誤碼
RequestTimeout
RequestTimeoutException
InternalError
IDPCommunicationError
I/O 失敗 (連線重設、DNS 解析失敗、通訊端逾時)
(任何沒有可辨識錯誤碼的 HTTP 500、502、503 或 504)

調節錯誤會以較長的基本延遲 (1,000 毫秒) 重試:

錯誤碼
Throttling
ThrottlingException
ThrottledException
RequestThrottledException
TooManyRequestsException
ProvisionedThroughputExceededException
TransactionInProgressException
LimitExceededException
PriorRequestNotComplete
RequestThrottled
EC2ThrottledException
RequestLimitExceeded
SlowDown
BandwidthLimitExceeded

無法重試的錯誤 (例如 AccessDeniedExceptionValidationExceptionResourceNotFoundException) 會立即傳回至您的程式碼。

注意

具有調節錯誤碼的 HTTP 5XX 歸類為調節錯誤,而不是暫時性錯誤,即使 5XX 錯誤通常是暫時性的。開發套件會先比對錯誤碼,然後回到 HTTP 狀態碼。

調節錯誤表示服務因為速率限制而主動拒絕您的請求,因此 SDK 在重試之前會等待更長的時間,讓服務有時間復原容量。如需特定延遲,軟體開發套件等待多久請參閱 。

軟體開發套件等待多久

SDK 使用指數退避搭配完全抖動。平均而言,每次重試會等待比上次更久的時間,並隨機分散來自多個用戶端的請求。

依錯誤類型區分的基本延遲

基本延遲取決於錯誤是暫時性還是限流:

錯誤類型 基本延遲 理由
暫時性 (非限流) 50 毫秒 暫時性錯誤通常會在幾毫秒內解決。短暫的基礎延遲可提供快速復原。
限流 1,000 毫秒 服務已限制請求的速率。較長的基本延遲可提供復原容量的時間。

退避公式

SDK 使用此公式計算每個重試延遲:

delay = random(0, 1) × min(20,000 ms, base_delay × 2^retry)

其中:

  • random(0, 1) 傳回介於 0 和 1 之間的均勻分佈值

  • base_delay 暫時性錯誤為 50 毫秒,調節錯誤為 1,000 毫秒

  • retry 第一次重試時從 0 開始 (第二次整體請求嘗試)

退避上限為 20 秒。無論已嘗試多少次,個別延遲都不會超過 20 秒。

工作範例

範例 1:暫時性錯誤,最多嘗試 3 次

步驟 發生的情況 Delay
嘗試 1 初始請求。服務傳回 HTTP 503。 (無)
嘗試 2 SDK 等待 random(0, 50 毫秒)。使用 503 重試失敗。 0–50 毫秒 (平均 ~25 毫秒)
第 3 次嘗試 SDK 等待 random(0, 100 毫秒)。重試成功。 0–100 毫秒 (平均 ~50 毫秒)

在兩次重試中新增的總延遲平均約為 75 毫秒。

範例 2:調節錯誤,最多嘗試 3 次

步驟 發生的情況 Delay
嘗試 1 初始請求。服務傳回 429 Throttling (無)
嘗試 2 SDK 等待 random(0, 1,000 毫秒)。重試傳回 429。 0–1,000 毫秒 (平均 ~500 毫秒)
第 3 次嘗試 SDK 等待 random(0, 2,000 毫秒)。重試成功。 0–2,000 毫秒 (平均 ~1,000 毫秒)

在兩次重試中新增的總延遲平均約為 1,500 毫秒。

範例 3:暫時性錯誤,達到退避上限

基本延遲為 50 毫秒時,上限之前的計算延遲為:

重試嘗試 運算最大延遲 20 秒後上限
1 50 毫秒 50 毫秒
2 100 毫秒 100 毫秒
5 800 毫秒 800 毫秒
9 12,800 毫秒 12,800 毫秒
10 25,600 毫秒 20,000 毫秒

對於暫時性錯誤,上限會在第 10 次重試 (第 11 次嘗試) 時生效。對於基礎為 1,000 毫秒的限流錯誤,上限會在第 6 次重試時生效。

注意

預設值為最多 3 次嘗試 (1 次初始請求 + 2 次重試) 時,永遠不會達到退避上限。此資料表說明如果您將 增加max_attempts到遠超過預設值,會發生什麼情況。

抖動為何重要

隨機乘數稱為完整抖動。如果沒有它,同時遇到錯誤的所有用戶端都會同時重試,造成大量的重試流量 (「雷擊雜湊」問題)。完全抖動會將重試均勻分散到整個退避時段,讓服務收到穩定的請求,而不是同步峰值。

例如,假設 1,000 個用戶端都同時收到 503。完整抖動會在 50 毫秒的時段均勻分配其第一次重試,而不是完全在 50 毫秒進行全部 1,000 次重試。

伺服器導向重試計時

有些 會在錯誤回應中 AWS 服務 包含 x-amz-retry-after標頭。標頭值是以毫秒為單位的延遲。出現此標頭時,開發套件會使用伺服器指定的延遲,並固定為計算的退避延遲的最小值,以及計算的退避延遲的最大值加上 5,000 毫秒。由於計算的退避本身限制為 20 秒,因此有效的伺服器導向延遲上限為 25 秒。SDK 不會套用抖動到此值,因為預期服務會抖動。這可讓服務在預期有可用容量時準確通訊。

重試配額 (權杖儲存貯體)

開發套件會維護內部字符預算,以追蹤成功請求與失敗的比例。當失敗普遍發生時,預算會耗盡,開發套件會直接傳回錯誤。您的應用程式會快速失敗,而不是等待不太可能成功的重試。這也會減少重試流量,協助服務中斷更快地解決。

重試配額的運作方式

字符預算開始已滿。每次重試嘗試都會扣除權杖。當重試成功時,軟體開發套件會還原該重試所耗用的字符。當請求在第一次嘗試時成功 (不需要重試),軟體開發套件會還原 1 個字符。當預算達到零時,開發套件會停止重試,並將錯誤直接傳回至您的程式碼。

參數 Value
預算容量 500 個字符
每次暫時性 (非限流) 重試的成本 14 個字符
每次限流重試的成本 5 個字符
重試後成功還原的字符 上次重試所耗用的金額 (14 或 5)
權杖在成功時還原,無需重試 1 個字符

暫時性重試的成本越高,就會反映其不同的失敗模式。500 和連線失敗等暫時性錯誤通常表示整個服務的問題。在這些情況下,持續重試不太可能成功。它會為您的呼叫增加延遲、將用戶端資源綁定起來,並可能延遲每個人的復原。調節錯誤表示服務需要更多時間才能成功請求。軟體開發套件會在重試之間等待更長的時間,以改善成功的可能性。

配額區塊何時重試

重試配額會隨時追蹤權杖,但只會在預算用盡時封鎖重試。在正常操作期間,幾乎所有請求都會成功,且預算會保持滿載。配額對重試沒有可觀測的影響。

成功重試只會還原自己的字符成本 (14 或 5 個字符),而不是相同請求中先前失敗重試的成本。例如,如果第一次重試失敗且第二次成功,預算會遺失 14 個權杖。當重試耗盡所有嘗試但未成功時,預算會消耗最快,但當請求在成功之前需要多次重試時也會逐漸耗盡。

在預設嘗試次數上限 3 次的情況下,當超過大約 22% 的請求導致持續暫時性失敗,或限流錯誤超過大約 32% 時,配額會開始耗盡。低於這些速率時,成功的請求會比失敗的重試耗盡預算更快地補充預算。

預算的 500 個權杖開始平衡提供緩衝,可吸收短暫的故障暴增。錯誤短暫激增,即使嚴重,也不會封鎖重試,除非它持續夠長的時間來耗盡緩衝區。

實際影響

  • 低失敗率:配額沒有作用。預算保持在或接近容量。

  • 在服務中斷期間:如果高百分比的請求在持續期間內失敗,配額會耗盡,且您的用戶端會立即收到錯誤,而不是等待重試。這可減少用戶端延遲、釋放執行緒和連線,並協助服務更快復原。

  • 復原:當服務復原且請求再次開始成功時,成功重試會還原其完整字符成本,第一次嘗試成功會還原 1 個字符。預算會逐漸重新填入,並自動繼續重試。

  • 範圍:字符預算通常範圍為單一 SDK 用戶端執行個體。確切範圍可能因 SDK 而異。它不會跨程序或主機共用。

服務特定的行為

DynamoDB

DynamoDB 用戶端使用針對 DynamoDB 低延遲設定檔最佳化的調校預設值:

設定 一般預設 DynamoDB 預設
暫時性 (非調節) 基本延遲 50 毫秒 25 毫秒
調節基本延遲 1,000 毫秒 1,000 毫秒
最大嘗試次數 3 4

這些預設值同時適用於 Amazon DynamoDB 和 DynamoDB Streams。

長輪詢操作

某些 AWS 操作使用長輪詢。他們可以保持連線開啟,等待工作到達。這些操作會受到特殊的重試處理:

  • SQS.ReceiveMessage

  • SFN.GetActivityTask

  • SWF.PollForActivityTask

  • SWF.PollForDecisionTask

特殊行為:當重試配額耗盡且重試遭到封鎖時 ( 中的步驟 7請求失敗時會發生什麼情況),軟體開發套件仍會套用退避延遲,再將錯誤傳回至程式碼。

這很重要,因為長輪詢操作通常在緊密迴圈中呼叫。您的程式碼會呼叫 ReceiveMessage、處理任何訊息,然後立即ReceiveMessage再次呼叫 。如果沒有強制退避,耗盡的字符預算會導致 SDK 在不延遲的情況下傳回錯誤。然後,您的輪詢迴圈會立即傳送下一個請求、激增用戶端 CPU 用量並產生額外的流量。強制退避延遲會中斷此週期,讓用戶端資源用量和輪詢速率在失敗期間保持可管理。

支援 AWS SDKs和工具

下表列出每個 SDK 中更新的重試行為的可用性。如需開發套件特定的詳細資訊,包括最低版本、before-and-after預設值和程式碼範例,請參閱 GitHub 追蹤問題。