AWS SDK for Rust で再試行を設定する
AWS SDK for Rust は、サービスリクエストに対するデフォルトの再試行動作とカスタマイズ可能な設定オプションを提供します。AWS のサービスを呼び出すと、予期しない例外が返されることがあります。スロットリングや一時的なエラーなど、特定のタイプのエラーは、呼び出しを再試行すれば成功する場合があります。
再試行動作は、共有 AWS config ファイルの環境変数または設定を使用してグローバルに設定できます。この方法の詳細については、「AWS SDK とツールのリファレンスガイド」の「再試行動作」を参照してください。再試行戦略の実装についての詳細と、それらの中からどれを選択すべきかについても説明しています。
代わりに、以下のセクションに示すように、これらのオプションをコードで設定することもできます。
デフォルトの再試行設定
すべてのサービスクライアントは、デフォルトとして、RetryConfigstandard 再試行戦略設定を使用ます。デフォルトでは、呼び出しは 3 回試行されます (最初の試行と 2 回の再試行)。さらに、再試行ストームを避けるために、各再試行はランダムな短時間の間隔で遅延します。この規則は、ほとんどのユースケースに適していますが、高スループットシステムなどの特定の状況では不適切な場合があります。
SDK では、一部のタイプのエラーのみが再試行可能とみなされます。再試行可能なエラーの例を以下に示します。
-
ソケットタイムアウト
-
サービス側のスロットリング
-
HTTP 5XX レスポンスなどの一時的なサービスエラー
以下の例は、再試行可能とはみなされません。
-
パラメータなしまたは無効
-
認証/セキュリティエラー
-
誤設定の例外
最大試行回数、遅延回数、バックオフ回数を設定して、standard 再試行戦略をカスタマイズできます。
最大試行回数
変更された RetryConfigaws_config::defaults に提供することにより、コードの最大試行回数をカスタマイズできます。
const CUSTOM_MAX_ATTEMPTS: u32 = 5; let retry_config = RetryConfig::standard() // Set max attempts. When max_attempts is 1, there are no retries. // This value MUST be greater than zero. // Defaults to 3. .with_max_attempts(CUSTOM_MAX_ATTEMPTS); let config = aws_config::defaults(BehaviorVersion::latest()) .retry_config(retry_config) .load() .await;
遅延とバックオフ
再試行が必要な場合、デフォルトの再試行戦略は次の試行の前に待機します。最初の再試行の遅延は小さいですが、それ以降の再試行の遅延は指数関数的に増加します。最大遅延量は、大きくなりすぎないように上限が設定されます。
すべての試行間の遅延には、ランダムなジッタが適用されます。ジッタは、再試行ストームを引き起こす可能性のある大規模なフリートの影響を緩和するのに役立ちます。エクスポネンシャルバックオフとジッタの詳細については、「AWS アーキテクチャブログ」の「エクスポネンシャルバックオフとジッタ
変更された RetryConfigaws_config::defaults に提供することにより、コードの遅延設定をカスタマイズできます。次のコードは、最初の再試行を最大 100 ミリ秒遅延させ、再試行間の最大時間は 5 秒に設定しています。
let retry_config = RetryConfig::standard() // Defaults to 1 second. .with_initial_backoff(Duration::from_millis(100)) // Defaults to 20 seconds. .with_max_backoff(Duration::from_secs(5)); let config = aws_config::defaults(BehaviorVersion::latest()) .retry_config(retry_config) .load() .await;
アダプティブ再試行モード
adaptive モード再試行戦略は、standard モード再試行戦略の代替としてスロットリングエラーを最小限に抑えるための理想的なリクエストレートを求める高度な手法です。
注記
アダプティブ再試行は高度な再試行モードです。この手法を使用することは通常お勧めしません。「AWS SDK とツールのリファレンスガイド」の「再試行動作」を参照してください。
アダプティブ再試行には、標準的な再試行のすべての機能が含まれます。クライアント側のレートリミッターを追加し、スロットリングされたリクエストのレートを、スロットリングされていないリクエストと比較して測定します。また、トラフィックが安全な帯域幅内に収まるように制限し、理想的にはスロットリングエラーをゼロに抑えます。
レートは、サービス条件やトラフィックパターンの変化にリアルタイムで適応し、それに応じてトラフィックのレートが増減する場合があります。重要な点として、レートリミッターはトラフィックが集中するシナリオでは初期の試行を遅延させる可能性があります。
コードで adaptive 再試行戦略を選択するには、次のような変更された RetryConfig
let config = aws_config::defaults(BehaviorVersion::latest()) .retry_config(RetryConfig::adaptive()) .load() .await;