高度なバックオフメカニズムは、サーバーサイドのスロットリング情報を使用してリトライ間隔を計算し、スロットリングサイクル中の API リクエストレートを管理します。
リトライメカニズムとスロットリングポリシーが追加されました。詳細については、「リトライメカニズム」をご参照ください。
コアライブラリ aliyun-java-sdk-core V4.6.0 以降は、リトライメカニズムをサポートし、スロットリングポリシーに基づく高度なバックオフメカニズムを提供します。詳細については、「リトライメカニズム」をご参照ください。次の Maven 依存関係を追加してください。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.0</version>
</dependency>
-
すべての API オペレーションが高度なバックオフメカニズムをサポートしているわけではありません。API オペレーションがこのメカニズムをサポートしているかどうかを確認するには、対応するサービスの API ドキュメントの [Quotas Info] セクションをご参照ください。例えば、Elastic Compute Service (ECS) の DescribeHpcClusters トピックの [Quotas Info] セクションをご参照ください。
-
API オペレーションがサポートしているかどうかに関係なく、SDK でこのメカニズムを有効にすることができます。API オペレーションがこのメカニズムをサポートしていない場合、バックオフポリシーとリクエスト無効化ポリシーは有効になりません。ただし、API オペレーションが後にこのメカニズムをサポートするようになった場合、スロットリングポリシーとリクエスト無効化ポリシーが予期せずトリガーされ、問題のトラブルシューティングがより困難になる可能性があります。
-
このメカニズムを有効にした後も、失敗した API 呼び出しを引き続き監視することを推奨します。バックオフメカニズムのみに依存すると、問題のトラブルシューティングが困難になる可能性があります。
-
以下の例は、API オペレーションがスロットリングポリシーに基づくバックオフメカニズムをサポートしていることを前提としています。
概要
高度なバックオフメカニズムには、次の 2 つのポリシーが含まれます。
-
バックオフポリシー
-
スロットリング中の API リクエスト無効化ポリシー
リトライ間隔は、EqualJitter エクスポネンシャルバックオフアルゴリズムを使用して計算されます。詳細については、「リトライメカニズム」をご参照ください。高度なバックオフメカニズムは、サーバーサイドのスロットリング情報に基づいて間隔をさらに調整します。
スロットリングポリシーに基づくバックオフポリシーの有効化
デフォルトでは、スロットリングに基づくバックオフポリシーは無効になっています。次のいずれかの方法で有効にすることができます。
-
リトライポリシーの設定
RetryPolicy retryPolicy = RetryPolicy.builder()
.maxNumberOfRetries(3) // 最大リトライ回数
.maxDelayTimeMillis(20 * 1000) // 最大リトライ間隔 (ミリ秒単位)。この間隔を超えた場合、リトライは実行されません。
//.retryConditions(retryConditions) // リトライをトリガーするために使用されるポリシー
.enableAliyunThrottlingControl(true) // スロットリングポリシーに基づくバックオフポリシーを有効にします。
//.throttlingConditions(throttlingConditions) // リトライを制限するために使用されるポリシー
.build();
request.setSysRetryPolicy(retryPolicy);
-
デフォルトリトライポリシーの使用
// デフォルトポリシー。enableAliyunThrottlingControl パラメータで、スロットリングに基づくバックオフポリシーの有効 (true) / 無効 (false) を指定します。
RetryPolicy retryPolicy = RetryPolicy.defaultRetryPolicy(
true
);
request.setSysRetryPolicy(retryPolicy);
スロットリングポリシーに基づくバックオフポリシーを有効にするメリット
-
不要なリトライを削減し、システムリソースの消費を低減します。
-
より正確なバックオフ間隔を計算することで、リトライの成功率を向上させます。
詳細設定
バックオフポリシー:スロットリングポリシーに基づくバックオフ時間の計算
スロットリングに基づくバックオフポリシーが有効になっている場合、バックオフ時間は次のように計算されます。
-
スロットリングがトリガーされていない場合、EqualJitter を使用してリトライ間隔が計算されます。
-
スロットリングがトリガーされた場合、リトライ間隔は、現在のスロットリングサイクルの残り時間と EqualJitter の結果のうち、大きい方の値になります。この間隔が 最大リトライ間隔 を超える場合、例外がスローされ、残りのスロットリングサイクル時間がキャッシュされ、リクエスト無効化ポリシーで使用されます。
スロットリング中の API リクエスト無効化ポリシー
スロットリングに基づくバックオフポリシーが有効になっており、スロットリングがトリガーされた場合、サーバーはレスポンスヘッダーに残りのクォータ情報を返します。この情報には、残りの API 呼び出し回数と現在のスロットリングサイクルの残り時間が含まれており、「User」および「API + User」ディメンションで報告されます。API 呼び出しがスロットリングされている場合、残りの呼び出し回数は 0 になります。
ヘッダー内の 2 つのディメンションに対応するキー:
-
「API + User」ディメンション:X-RateLimit-User-API
-
「User」ディメンション:X-RateLimit-User
「API + User」ディメンションの例:
"X-RateLimit-User-API" : "Remain:1,Limit:2,Time:1000,TimeLeft:122,Reset:1637835220000"
Remain:残りの API 呼び出し回数 (INT 型)。値 -1 は呼び出し回数が十分であることを示します。API 呼び出しがスロットリングされている場合は 0 が返されます。
Limit:最大スロットリングしきい値 (INT 型)。
Time:スロットリング期間 (LONG 型、ミリ秒単位)。
TimeLeft:現在のスロットリングサイクルの残り時間 (LONG 型、ミリ秒単位)。
Reset:次のスロットリングサイクルの開始時刻 (LONG 型、ミリ秒単位のタイムスタンプ)。
SDK は現在のスロットリングサイクルの残り時間を追跡し、その期間中は新規の呼び出しまたはリトライをブロックします。残り時間が最大リトライ間隔を超える場合、エラーがスローされます。それ以外の場合、システムはスロットリングサイクルが終了するまで待機してから、呼び出しを開始またはリトライします。
スロットリングのデバッグの有効化
スロットリングがトリガーされるのを待たずにスロットリングクォータ情報を取得するには、リクエストヘッダーで X-RateLimit-Mode を debug に設定してください。
request.putHeadParameter("X-RateLimit-Mode", "debug");
その後、残りのクォータ情報が各 API 呼び出しのレスポンスヘッダーに含まれるようになります。