プロデューサーが ApsaraMQ for RocketMQ サービスにメッセージを送信すると、ApsaraMQ for RocketMQ はロードバランシングポリシーを使用してメッセージを複数のキューに均等に分散させ、ホットスポットキューとパフォーマンスボトルネックを防ぎます。このトピックでは、ApsaraMQ for RocketMQ のプロデューサーロードバランシングポリシーについて説明します。
背景情報
- ディザスタリカバリ: ローカルノードに障害が発生した場合にメッセージをどのように切り替えるかを決定できます。
- メッセージの順序: ApsaraMQ forRocketMQ が厳密な先入れ先出しのメッセージ順序をどのように保証するかをよりよく理解できます。
- ロードバランシング: 複数のノードにまたがるメッセージの分散パターンを理解し、適切なトラフィック移行およびスケーリングソリューションを設定できます。
ラウンドロビン
使用範囲
ラウンドロビンロードバランシングは、デフォルトのロードバランシングポリシーであり、ApsaraMQ forRocketMQ で順序なしメッセージ (通常、スケジュール、およびトランザクションメッセージ) でサポートされている唯一のロードバランシングポリシーです。
ポリシーの仕組み
ラウンドロビンロードバランシングでは、プロデューサーは指定された Topic 内のすべてのキューに周期的にメッセージを送信し、メッセージが Topic 内のすべてのキューに均等に分散されるようにします。

上の図では、Queue 1、Queue 2、および Queue 3 は Topic 内のキューであり、文字 M と数字の組み合わせは、順に送信されるメッセージを示します。
プロデューサーは周期的にキューにメッセージを送信します。プロデューサーは最初のメッセージ M1 を Queue 1 に、2 番目のメッセージ M2 を Queue 2 に、3 番目のメッセージ M3 を Queue 3 に送信し、すべてのメッセージが送信されるまでこの分散パターンを繰り返します。
例外処理
メッセージの送信に失敗した場合、ApsaraMQ for RocketMQ は障害の原因を特定します。原因に基づいて、宛先を選択する際に、障害が発生したキューを含むノードを一時的にスキップすることがあります。このプロセスにより、自動的な障害分離が提供されます。
機能
ラウンドロビンロードバランシングは、順序なしメッセージでのみサポートされます。このポリシーにより、メッセージが均等に分散され、Topic のパフォーマンスが最大化されます。
例
RoundRobin モードは、非シーケンシャルメッセージのデフォルトであり、追加の設定は必要ありません。
// デフォルトでは、通常メッセージに対してラウンドロビンロードバランシングが有効になっています。
// 通常メッセージを送信します。
MessageBuilder messageBuilder = null;
for (int i = 0; i < 10; i++) {
// 通常メッセージを配信するためにラウンドロビンロードバランシングを設定する必要はありません。SDK には、メッセージを均等に分散させるためのラウンドロビンメッセージングを実行するために必要なロジックが含まれています。
Message message = messageBuilder.setTopic("normalTopic")
// システムがキーワードを使用してメッセージを正確に見つけられるように、メッセージインデックスキーを指定します。
.setKeys("messageKey")
// コンシューマーがタグを使用してメッセージをフィルターできるように、メッセージタグを指定します。
.setTag("messageTag")
// メッセージ本文を設定します。
.setBody("messageBody".getBytes())
.build();
try {
// メッセージを送信します。メッセージ送信の結果と、失敗などの例外に注意してください。
SendReceipt sendReceipt = producer.send(message);
System.out.println(sendReceipt.getMessageId());
} catch (ClientException e) {
e.printStackTrace();
}
}
MessageGroupHash
使用範囲
MessageGroupHash ベースのロードバランシングは、デフォルトのロードバランシングポリシーであり、ApsaraMQ forRocketMQ で順序付きメッセージでサポートされている唯一のロードバランシングポリシーです。
ポリシーの原則: ハッシュアルゴリズム
MessageGroupHash ベースのロードバランシングは、SipHash アルゴリズムを使用してメッセージを分散させます。MessageGroupHash ベースのロードバランシングモードでは、プロデューサーは組み込みの SipHash アルゴリズムに基づいて、同じメッセージグループ内のメッセージを同じキューに送信し、同じメッセージグループ内のメッセージが送信された順序でキューに保存されることを保証します。

上の図では、G1-M1 は MessageGroup 1 の最初のメッセージ、G1-M2 は 2 番目のメッセージ、G1-M3 は 3 番目のメッセージです。プロデューサーはこれらのメッセージを同じキュー (MessageQueue 1) に送信し、3 つのメッセージが送信された順序と同じ順序でキューに保存されることを保証します。
機能
MessageGroupHash ベースのロードバランシングは、順序付きメッセージでのみサポートされます。このロードバランシングポリシーは、同じメッセージグループ内のメッセージの順序付き配信を保証します。
複数のメッセージグループのメッセージ数が大幅に異なる場合、MessageGroupHash ベースのロードバランシングでは、メッセージの均等な分散とパフォーマンスのスケーリングを保証できません。特定のシナリオでは、MessageGroupHash ベースのロードバランシングにより、ほとんどのメッセージが少数のキューに保存される可能性があります。多くのメッセージが少数のメッセージグループに保存されるのを防ぐために、メッセージを複数のメッセージグループに分散させることをお勧めします。
例
デフォルトでは、順序付きメッセージに対して MessageGroupHash ベースのロードバランシングが有効になっています。次のサンプルコードは、MessageGroupHash ベースのロードバランシングの例を示しています。
// デフォルトでは、順序付きメッセージに対して MessageGroupHash ベースのロードバランシングが有効になっています。
for (int i = 0; i < 10; i++) {
Message message = messageBuilder.setTopic("fifoTopic")
// システムがキーワードを使用してメッセージを正確に見つけられるように、メッセージインデックスキーを指定します。
.setKeys("messageKey")
// コンシューマーが指定されたタグに基づいてメッセージをフィルターできるように、メッセージタグを指定します。
.setTag("messageTag")
// MessageGroup を設定します。同じメッセージグループ内のメッセージは、SipHash アルゴリズムに基づいて同じキューに分散されます。
.setMessageGroup("fifoGroupA")
// メッセージ本文を設定します。
.setBody("messageBody".getBytes())
.build();
try {
// メッセージを送信します。メッセージ送信の結果と、失敗などの例外に注意してください。
SendReceipt sendReceipt = producer.send(message);
System.out.println(sendReceipt.getMessageId());
} catch (ClientException e) {
e.printStackTrace();
}
}バージョンの互換性
- MessageGroupHash モード
MessageGroupHash ロードバランシングポリシーは、ApsaraMQ for RocketMQ サーバーバージョン 5.x 以降でサポートされています。4.x や 3.x などの以前のバージョンでは、このポリシーはサポートされていません。
したがって、順序付きメッセージの送信メカニズムをバージョン 4.x または 3.x から 5.x にアップグレードする場合は、メッセージの順序が維持されるように対策を講じる必要があります。たとえば、バージョン 5.x に切り替える前に、Topic 内のすべてのメッセージを消費できます。
- ラウンドロビンモード
ラウンドロビンロードバランシングポリシーは、サーバーバージョン 5.x、4.x、および 3.x でサポートされており、互換性の問題はありません。
使用上の注意
MessageGroupHash ベースのロードバランシングを使用する際のキューの過負荷を回避する
MessageGroupHash モードでは、ApsaraMQ for RocketMQ は、同じメッセージグループからのメッセージが同じキューに送信されることを保証します。ビジネスロジックがメッセージを少数のメッセージグループに集中させると、サービスはこれらのメッセージを少数のキューにのみ保存します。これにより、ストレージへの負荷が増加し、キューのホットスポットが発生し、Topic のスケーリング能力が制限される可能性があります。
メッセージを複数のメッセージグループに分散させることをお勧めします。たとえば、e コマースシナリオで注文 ID とユーザー名をメッセージグループのキーワードとして使用して、メッセージが複数のメッセージグループに分散され、ユーザー固有のメッセージが順序どおりに処理されるようにすることができます。
1 つのキューへのメッセージ送信を回避する
パフォーマンスのスケーリングとディザスタリカバリを確保するために、順序付きメッセージと順序なしメッセージのロードバランシングには複数のキューを使用することをお勧めします。Topic にキューが 1 つしかない場合、ロードバランシングポリシーに関係なく、メッセージはそのキューにのみ送信されます。これにより、パフォーマンスボトルネックの問題やディザスタリカバリの問題が発生する可能性があります。