このトピックでは、スロットリングポリシーに基づく高度なバックオフメカニズムについて説明します。
再試行メカニズムとスロットリングポリシーが追加されました。詳細については、「再試行メカニズム」をご参照ください。
コアライブラリ 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 ドキュメントの クォータ情報クォータ情報 セクションを参照してください。たとえば、Elastic Compute Service(ECS)の DescribeHpcClusters トピックの セクションを参照してください。
クラウドサービスの API オペレーションがスロットリングポリシーに基づくバックオフメカニズムをサポートしているかどうかに関係なく、SDK でスロットリングポリシーに基づくバックオフメカニズムを有効にすることができます。API オペレーションがスロットリングポリシーに基づくバックオフメカニズムをサポートしていない場合、このメカニズムを有効にしても、SDK で指定されたバックオフポリシーとスロットリング中の API リクエストを無効にするポリシーは有効になりません。その効果は、SDK でスロットリングポリシーに基づくバックオフメカニズムを無効にした場合と同じです。ただし、API オペレーションが突然スロットリングポリシーに基づくバックオフメカニズムをサポートするようになった場合、API オペレーションを呼び出すと、スロットリングポリシーと API リクエストを無効にするポリシーがトリガーされる可能性があります。この場合、トラブルシューティングがより困難になります。
スロットリングポリシーに基づくバックオフメカニズムを有効にした後でも、呼び出しに失敗した API オペレーションを監視することをお勧めします。スロットリングポリシーに基づくバックオフメカニズムのみを使用すると、問題のトラブルシューティングができない場合があります。
以下の例の条件は、API オペレーションがスロットリングポリシーに基づくバックオフメカニズムをサポートしていることです。
概要
スロットリングポリシーに基づく高度なバックオフポリシーは、次の 2 つのポリシーに分類されます。
バックオフポリシー
スロットリング中の API リクエストを無効にするポリシー
各再試行の間隔は、指数バックオフアルゴリズム EqualJitter を使用して計算されます。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 リクエストを無効にするポリシー
スロットリングポリシーに基づくバックオフポリシーが有効になっている場合、スロットリングがトリガーされると、サーバーはヘッダーにスロットリングに関する残りのクォータ情報を返します。サーバーは、「ユーザー」と「API + ユーザー」のディメンションで、API 呼び出しの残り数や現在のスロットリングサイクルの残り時間などの情報をクライアントに返します。API 呼び出しがスロットリングされている場合、API 呼び出しの残り数は 0 です。
ヘッダーの 2 つのディメンションに対応するキー:
「API + ユーザー」ディメンション: X-RateLimit-User-API
「ユーザー」ディメンション: X-RateLimit-User
「API + ユーザー」ディメンションの例:
"X-RateLimit-User-API" : "Remain:1,Limit:2,Time:1000,TimeLeft:122,Reset:1637835220000"
Remain: API 呼び出しの残り数。Remain パラメータの値は INT 型です。値が -1 の場合、API 呼び出しの残り数は十分です。API 呼び出しがスロットリングされている場合、値 0 が返されます。
Limit: 最大スロットリングしきい値。値は INT 型です。
Time: スロットリングの時間範囲。値は LONG 型です。単位: ミリ秒。
TimeLeft: 現在のスロットリングサイクルの残り時間。値は LONG 型です。単位: ミリ秒。
Reset: 次のスロットリングサイクルの開始時刻。値は LONG 型で、ミリ秒単位のタイムスタンプです。SDK は、現在のスロットリングサイクルの残り時間を管理します。現在のスロットリングサイクルの残り時間に基づいて計算されたバックオフ時間中は、呼び出しの開始または再試行が制限されます。バックオフ時間が最大再試行間隔より大きい場合、エラーがスローされます。バックオフ時間が最大再試行間隔以下である場合、システムは呼び出しを開始または再試行できるまで待機します。
スロットリングデバッグを有効にする
スロットリングポリシーに基づくバックオフポリシーが有効になっている場合、スロットリングがトリガーされると、サーバーはヘッダーにスロットリングに関する残りのクォータ情報を返します。リクエストヘッダーで X-RateLimit-Mode を debug に設定することにより、呼び出しでクォータ情報を返すように要求することもできます。
request.putHeadParameter("X-RateLimit-Mode", "debug");これにより、各 API 呼び出しのレスポンスヘッダーに残りのクォータ情報を取得できます。