すべてのプロダクト
Search
ドキュメントセンター

ApsaraMQ for RabbitMQ:インスタンスのスロットリングのベストプラクティス

最終更新日:Nov 09, 2025

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

単一インスタンスのキューをパージ

purgeQueue

500 TPS

なし

500 TPS

単一インスタンスの exchange を作成

exchangeDeclare

500 TPS

なし

500 TPS

単一インスタンスの exchange を削除

exchangeDelete

500 TPS

なし

500 TPS

単一インスタンスのキューを作成

queueDeclare

500 TPS

なし

500 TPS

単一インスタンスのキューを削除

queueDelete

500 TPS

なし

500 TPS

単一インスタンスの binding を作成

queueBind

500 TPS

なし

500 TPS

単一インスタンスの binding を削除

queueUnbind

500 TPS

なし

500 TPS

単一インスタンスのメッセージを回復

basicRecover

500 TPS

なし

500 TPS

単一インスタンスのメッセージを再キューイング

  • basicReject(requeue=true)

  • basicNack(requeue=true)

20 TPS

なし

20 TPS

スロットリングルール

ApsaraMQ for RabbitMQ インスタンスのピーク TPS がその仕様の TPS 制限を超えると、ApsaraMQ for RabbitMQ インスタンスはスロットリングされます。

スロットリングがトリガーされると、次のイベントが発生します。

エラーコードとエラーメッセージ

  • エラーコード: reply-code=530

  • エラーメッセージ: reply-text=denied for too many requests

次のサンプルコードは、Java クライアントからのエラースタックの例です。

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>
(reply-code=530, reply-text=denied for too many requests, ReqId:5FB4C999314635F952FCBFF6, ErrorHelp[dstQueue=XXX_test_queue,
srcExchange=Producer.ExchangeName,bindingKey=XXX_test_bk, http://mrw.so/6rNqO8], class-id=50, method-id=20)
    at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:516)
    at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:346)
    at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
    at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
    at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:672)
    at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:48)
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:599)
    at java.lang.Thread.run(Thread.java:748)

エラーコードを処理するためのサンプルコード

次のサンプルコードは 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 つのメソッドを提供します。

メソッド

説明

時間粒度

リソースレベル

(推奨) CloudMonitor を使用してインスタンスのピーク TPS をクエリし、アラートルールを構成する

利点:

  • このクエリメソッドを使用して、過去 14 日間のピーク TPS の変更をクエリできます。このクエリメソッドは、例外を効率的に特定するのに役立ちます。

  • インスタンスのピーク TPS をメトリックとして使用して、アラートルールを構成できます。

  • このクエリメソッドを使用しても課金されません。

分レベルのピーク TPS

1 分間の統計期間中のインスタンスのピーク TPS

インスタンスのピーク TPS

(推奨) [インスタンス詳細] ページでインスタンスのピーク TPS をクエリする

  • 利点:

    • このクエリメソッドを使用して、秒レベルでピーク TPS をクエリできます。このクエリメソッドは、例外を正確に特定するのに役立ちます。

    • 特定の API 操作のピーク TPS をクエリできます。

    • このクエリメソッドを使用しても課金されません。

  • 使用上の注意: 長すぎるクエリ結果リストの表示を防ぐため、最初の 10 分以内に返されたクエリ結果のみが表示されます。

秒レベルのピーク TPS

  • インスタンスのピーク TPS

  • 特定の API 操作のピーク TPS

Simple Log Service を使用してインスタンスのピーク TPS をクエリする

  • 利点: Simple Log Service の文を使用して、インスタンスのピーク TPS をクエリできます。このクエリメソッドは、複雑なビジネスシナリオで例外を特定するのに役立ちます。

  • 使用上の注意:

    • 前の 2 つのクエリメソッドと比較して、このクエリメソッドはより複雑で、クエリ結果は理解しにくいです。

    • Simple Log Service を使用すると課金されます。Simple Log Service の課金の詳細については、「機能ごとの課金モデルの課金項目」をご参照ください。

第 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 統合」をご参照ください。