ApsaraMQ for RabbitMQ は、単一インスタンスのピーク秒間トランザクション数 (TPS) をスロットリングします。このトピックでは、ApsaraMQ for RabbitMQ インスタンスのスロットリングルール、スロットリングがトリガーされた後の動作、およびスロットリングを管理するためのベストプラクティスについて説明します。
スロットリングのしきい値
インスタンスの合計 TPS スロットリングしきい値
インスタンスシリーズ | サーバーレスインスタンス | サブスクリプションインスタンス | ||||||
エディション | 共有 | 専用 | Elastic TPS 無効 | Elastic TPS 有効 | ||||
予約済み + Elastic/トラフィック量による支払い | 予約済み + Elastic | Enterprise Edition | Platinum Edition | Professional Edition | Enterprise Edition | Platinum Edition | Professional Edition | |
スロットリングしきい値 | 最大 50,000 TPS | 基本インスタンスタイプのピーク TPS の 2 倍 | 基本インスタンスタイプのピーク TPS | 基本インスタンスタイプのピーク TPS の 2 倍、最大 50,000 TPS | 基本インスタンスタイプのピーク TPS の 2 倍、最大 50,000 TPS | 基本インスタンスタイプのピーク TPS の 1.5 倍 | ||
シングルノードの SendMessage TPS スロットリングしきい値
サーバーは、インスタンス内の各バックエンドサービスノードの SendMessage TPS を制限します。スロットリングしきい値は次のとおりです。
制限 | サーバーレスインスタンス | サブスクリプションインスタンス | ||||
共有 | 専用 | Enterprise Edition | Platinum Edition | Professional Edition | ||
累積量 | 予約済み + Elastic | 予約済み + Elastic | ||||
スロットリングしきい値 | 25,000 TPS | 25,000 TPS | なし | 25,000 TPS | なし | 25,000 TPS |
API 操作のスロットリングしきい値
制限 | 制限管理インターフェイス | サーバーレスインスタンス | サブスクリプションインスタンス | |||
共有 | 専用 | Enterprise Edition | Platinum Edition | Professional Edition | ||
予約済み + Elastic/トラフィック量による支払い | 予約済み + Elastic | |||||
単一インスタンスのキューをパージ |
| 500 TPS | なし | 500 TPS | ||
単一インスタンスの exchange を作成 |
| 500 TPS | なし | 500 TPS | ||
単一インスタンスの exchange を削除 |
| 500 TPS | なし | 500 TPS | ||
単一インスタンスのキューを作成 |
| 500 TPS | なし | 500 TPS | ||
単一インスタンスのキューを削除 |
| 500 TPS | なし | 500 TPS | ||
単一インスタンスの binding を作成 |
| 500 TPS | なし | 500 TPS | ||
単一インスタンスの binding を削除 |
| 500 TPS | なし | 500 TPS | ||
単一インスタンスのメッセージを回復 |
| 500 TPS | なし | 500 TPS | ||
単一インスタンスのメッセージを再キューイング |
| 20 TPS | なし | 20 TPS | ||
スロットリングルール
ApsaraMQ for RabbitMQ インスタンスのピーク TPS がその仕様の TPS 制限を超えると、ApsaraMQ for RabbitMQ インスタンスはスロットリングされます。
スロットリングがトリガーされると、次のイベントが発生します。
ApsaraMQ for RabbitMQ ブローカーはエラーコードを返します。詳細については、「エラーコードとエラーメッセージ」をご参照ください。
ApsaraMQ for RabbitMQ ブローカーは 現在のリクエストのチャンネルを閉じます。コードで例外をキャッチしてチャンネルを再度開くことができます。詳細については、「エラーコードを処理するためのサンプルコード」をご参照ください。
エラーコードとエラーメッセージ
エラーコード: reply-code=530
エラーメッセージ: reply-text=denied for too many requests
エラーコードを処理するためのサンプルコード
次のサンプルコードは Java です。
private static final int MAX_RETRIES = 5; // 最大リトライ回数。
private static final long WAIT_TIME_MS = 2000; // 各リトライの待機時間 (ミリ秒)。
private void doAnythingWithReopenChannels(Connection connection, Channel channel) {
try {
// ......
// 現在のチャンネルで実行される操作。
// たとえば、メッセージの送信または消費。
// ......
} catch (AlreadyClosedException e) {
String message = e.getMessage();
if (isChannelClosed(message)) {
// チャンネルが閉じている場合は、チャンネルを閉じて再作成します。
channel = createChannelWithRetry(connection);
// 再接続後、他の操作を続行できます。
// ......
} else {
throw e;
}
}
}
private Channel createChannelWithRetry(Connection connection) {
for (int attempt = 1; attempt <= MAX_RETRIES; attempt++) {
try {
return connection.createChannel();
} catch (Exception e) {
System.err.println("Failed to create channel. Attempt " + attempt + " of " + MAX_RETRIES);
// エラーを確認します。スロットリングが原因でチャンネルがまだ閉じている場合は、待機してからリトライできます。
// このリトライロジックを削除することもできます。
if (attempt < MAX_RETRIES) {
try {
Thread.sleep(WAIT_TIME_MS);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // 中断された状態を復元します。
}
} else {
throw new RuntimeException("Exceeded maximum retries to create channel", e);
}
}
}
throw new RuntimeException("This line should never be reached"); // 理論上、このコード行には到達できません。
}
private boolean isChannelClosed(String errorMsg) {
// エラーメッセージに "channel.close" が含まれているかどうかを確認します。このエラーは、チャンネルが閉じていることを示します。
// エラーには、530 や 541 などのエラーメッセージが含まれる場合があります。
if (errorMsg != null && errorMsg.contains("channel.close")) {
System.out.println("[ChannelClosed] Error details: " + errorMsg);
return true;
}
return false;
}インスタンスのピーク TPS のクエリ
インスタンスの実際のピーク TPS をクエリして、ビジネスのトラフィックの変動とピークトラフィックを理解し、インスタンスの仕様がビジネス要件を満たしているかどうかを判断できます。
ApsaraMQ for RabbitMQ は、インスタンスのピーク TPS をクエリするために、次の 3 つのメソッドを提供します。
メソッド | 説明 | 時間粒度 | リソースレベル |
利点:
| 分レベルのピーク TPS 1 分間の統計期間中のインスタンスのピーク TPS | インスタンスのピーク TPS | |
| 秒レベルのピーク TPS |
| |
| 第 2 レベルのピーク TPS | インスタンスのピーク TPS |
TPS 超過によりスロットリングがトリガーされた場合の対処方法
ピーク TPS が適切に構成されていないためにインスタンスまたは接続でスロットリングがトリガーされ、ビジネスに影響を与える場合は、次のソリューションを使用することをお勧めします。
単一インスタンスの合計 TPS 超過によるスロットリングのソリューション
テストシナリオ、またはピークトラフィックが不確定またはトラフィック量が少ない短期的なシナリオでは、サーバーレスの ApsaraMQ for RabbitMQ インスタンスを使用することをお勧めします。このようなシナリオでサブスクリプションベースの ApsaraMQ for RabbitMQ インスタンスを使用する場合は、インスタンスの Elastic TPS 機能を有効にすることをお勧めします。詳細については、「インスタンスの Elastic TPS 機能を有効にする」をご参照ください。
トラフィックが安定して大量にある長期的なシナリオでは、TPS 仕様をスペックアップすることをお勧めします。詳細については、「インスタンス構成のスペックアップ」をご参照ください。
単一ノードでの TPS 超過によるスロットリングのソリューション
ApsaraMQ for RabbitMQ クラスターは分散アーキテクチャを使用します。クライアントがクラスター内の複数のサービスノードにバランスよく接続できるように、各キューに複数の接続 (少なくとも 10) を作成することをお勧めします。このメソッドは、負荷のホットスポットを効果的に防止し、メッセージの送信と消費の効率を向上させることができます。
Spring ユーザーの場合は、
CachingConnectionFactoryの CONNECTION モードを使用することをお勧めします。詳細については、「Spring 統合」をご参照ください。