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

ApsaraMQ for RocketMQ:負荷分散ポリシー

最終更新日:Mar 12, 2026

ApsaraMQ for RocketMQ は、プロデューサーがメッセージをキューにルーティングする方法と、ブローカーがメッセージまたはキューをコンシューマーに割り当てる方法を制御するために、負荷分散ポリシーを使用します。コンシューマー側のポリシーは、ご利用の TCP クライアント SDK のバージョンによって異なります。

仕組み

ApsaraMQ for RocketMQ は、2 つのコンシューマー負荷分散モデルをサポートしています。

モデル消費者行動互換性主な特徴
メッセージベースブローカーは個々のメッセージをコンシューマーに分散します。複数のコンシューマーが同じキューからのメッセージを処理できます。TCP client SDK for Java V2.x.x.Final、TCP client SDK for C++ V3.x.xコンシューマー数がキュー数を超えてもアイドル状態のコンシューマーは発生しません
キューベースブローカーはキュー全体をコンシューマーに割り当てます。各キューは厳密に 1 つのコンシューマーによって処理されます。TCP client SDK for Java V1.x.x.Final、TCP client SDK for C++ V1.x.x および V2.x.xアイドル状態のコンシューマーを避けるため、コンシューマー数はキュー数を超えないようにしてください

プロデューサーの負荷分散は、どちらのモデルでも同じように機能します。

  • 順序なしメッセージ (通常メッセージ、トランザクションメッセージ、スケジュールメッセージ、遅延メッセージ): プロデューサーはメッセージをラウンドロビン方式でキューに送信します。

  • 順序付きメッセージ: プロデューサーは、同じシャーディングキーを持つすべてのメッセージを同じキューに送信します。

SDK for Java V2.x.x.Final および SDK for C++ V3.x.x と互換性のある負荷分散ポリシー

これらの負荷分散ポリシーは、キュー全体ではなく個々のメッセージをコンシューマーに分散します。複数のコンシューマーが同じキューからのメッセージを同時に処理でき、コンシューマー数がキュー数を超えてもアイドル状態のコンシューマーは発生しません。

前提条件

これらの負荷分散ポリシーを使用するには、TCP クライアント SDK をアップグレードしてください。

  • TCP client SDK for Java: V2.x.x.Final にアップグレードしてください。インスタンスは、中国 (杭州)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (フフホト)、中国 (深セン)、中国 (成都)、ドイツ (フランクフルト)、またはインドネシア (ジャカルタ) のいずれかのリージョンにデプロイされている必要があります。

  • TCP client SDK for C++: V3.x.x にアップグレードしてください。インスタンスは任意のリージョンにデプロイできます。

プロデューサーのルーティング

プロデューサーの負荷分散は、SDK のバージョンに関係なく同じです。

  • 順序なしメッセージ (通常メッセージ、トランザクションメッセージ、スケジュールメッセージ、遅延メッセージ): プロデューサーはメッセージをラウンドロビン方式でキューに送信します。この例では、3 つのキューが利用可能です。プロデューサーは Msg1 を Queue 1 に、Msg2 を Queue 2 に、Msg3 を Queue 3 に、Msg4 を Queue 1 に、といった順序で送信します。

    Producer - Normal messages

  • 順序付きメッセージ: プロデューサーは、同じシャーディングキーを持つすべてのメッセージを同じキューに送信します。この例では、シャーディングキー 1 を持つすべてのメッセージは Queue 1 に、シャーディングキー 2 を持つすべてのメッセージは Queue 2 に送信されます。

    Producer - Ordered messages

順序なしメッセージのコンシューマー割り当て

順序なしメッセージの場合、ブローカーはトピック内のすべてのメッセージを同じグループ内のコンシューマーに均等に分散します。同じキュー内のメッセージは、異なるコンシューマーによって同時に消費できます。

Consumer - Normal messages

この例では、Queue 2 内の 4 つのメッセージが、それぞれ Consumer 1、Consumer 2、Consumer 3、Consumer 4 に分散されます。各コンシューマーは、メッセージがどのキューに属しているかに関係なく、独立してメッセージを処理します。

順序付きメッセージのコンシューマー割り当て

順序付きメッセージの場合、ブローカーはシャーディングキーに基づいてメッセージを分散します。同じシャーディングキーを持つすべてのメッセージは同じコンシューマーに送られ、生成順序が保持されます。異なるシャーディングキーを持つメッセージは、異なるコンシューマーに分散できます。

Consumer - Ordered messages
説明
  • 3-1: この背景色のメッセージは Queue 1 に属します。たとえば、Msg2-1 は Queue 1 の 2 番目のメッセージであり、そのシャーディングキーは 1 です。

  • 3-2: この背景色のメッセージは Queue 2 に属します。たとえば、Msg3-2 は Queue 2 の 3 番目のメッセージであり、そのシャーディングキーは 2 です。

この例では、次のようになります。

  • Msg1-1、Msg2-1、Msg3-1 はすべてシャーディングキー 1 を共有するため、Consumer 1 に送られます。

  • シャーディングキー 2 を持つメッセージはすべて Consumer 2 に送られます。

  • Msg4-3 と Msg4-4 は異なるシャーディングキーを持つため、異なるコンシューマーに送られます。

SDK for Java V1.x.x.Final および SDK for C++ V1.x.x および V2.x.x と互換性のある負荷分散ポリシー

これらの負荷分散ポリシーは、キュー全体をコンシューマーに割り当てます。各キューは一度に厳密に 1 つのコンシューマーによって処理されます。順序なしメッセージと順序付きメッセージの割り当てポリシーは同じです。

キューの分散方法

ApsaraMQ for RocketMQ アーキテクチャには、ブローカーとネームサーバーが含まれます。ブローカーはトピックのルーティング情報をネームサーバーにレポートします。デフォルトでは、トピック内のメッセージはブローカーあたり 8 つのキューに分散されます。キューは論理的な概念です。ブローカーはこれらのキューを同じグループ内のすべてのコンシューマーに均等に割り当てます。

プロデューサーのルーティング

プロデューサーの負荷分散は、SDK for Java V2.x.x.Final および SDK for C++ V3.x.x と同じです。

  • 順序なしメッセージ: プロデューサーはメッセージをラウンドロビン方式でキューに送信します。

  • 順序付きメッセージ: プロデューサーは、同じシャーディングキーを持つすべてのメッセージを同じキューに送信します。

詳細と図については、上記の「プロデューサーのルーティング」をご参照ください。

コンシューマーの割り当て

各キューは一度に 1 つのコンシューマーにのみ割り当てられるため、コンシューマーとキューの比率はリソース使用率に直接影響します。

  • キューよりも多くのコンシューマー: 余分なコンシューマーはアイドル状態のままになります。たとえば、8 つのキューと 10 のコンシューマーがある場合、2 つのコンシューマーはメッセージを処理しません。

    Consumer - consumers  / / /> queues

  • コンシューマーとキューが同数: 各コンシューマーは厳密に 1 つのキューからメッセージを処理します。

    Consumer - consumers = queues

  • キューよりも少ないコンシューマー: 各コンシューマーは複数のキューからメッセージを処理します。

    Consumer - consumers < queues

メッセージの蓄積

キューベースの負荷分散では、ハードウェアの制約、システム制限、リモートプロシージャコール (RPC) の問題、または Java ガベージコレクション (GC) の一時停止により、コンシューマーが割り当てられたキュー内のメッセージを迅速に処理できない場合があります。この場合、メッセージはキューに蓄積されます。