プロデューサーがApsaraMQ for RocketMQにメッセージを送信すると、ApsaraMQ for RocketMQは、プロデューサーに設定された負荷分散ポリシーに基づいて、メッセージを個々のキューに均等に分散します。 これにより、キューの過負荷やパフォーマンスのボトルネックの問題を防ぎます。 このトピックでは、ApsaraMQ for RocketMQがプロデューサー向けに提供する負荷分散ポリシーについて説明します。
背景情報
ApsaraMQ forRocketMQが提供するロードバランシングポリシーをよく理解することで、次のシナリオに直面したときに実行する適切な対策を決定できます。
ディザスタリカバリ: ローカルノードに障害が発生した場合のメッセージの切り替え方法を確認できます。
メッセージの順序付け: ApsaraMQ forRocketMQが、先入れ先出しメッセージの厳密な順序付けを保証する方法をよりよく理解できます。
負荷分散: 複数のノード間でのメッセージの配布パターンを理解し、適切なトラフィック移行およびスケーリングソリューションを設定できます。
ラウンドロビン
使用範囲
ラウンドロビン負荷分散は、デフォルトの負荷分散ポリシーであり、ApsaraMQ forRocketMQで順序付けられていないメッセージ (通常、スケジュール、およびトランザクションメッセージ) に対してサポートされる唯一の負荷分散ポリシーです。
ポリシーの仕組み
ラウンドロビン負荷分散では、プロデューサーは指定されたトピック内のすべてのキューにメッセージを1サイクルで送信し、メッセージがトピック内のすべてのキューに均等に分散されるようにします。
上の図では、キュー1、キュー2、およびキュー3はトピック内のキューであり、文字Mと数字の組み合わせは、順番に送信されるメッセージを示します。
プロデューサは、サイクルでキューにメッセージを送信する。 プロデューサは、第1のメッセージM1をキュー1に送信し、第2のメッセージM2をキュー2に送信し、第3のメッセージM3をキュー3に送信し、すべてのメッセージが送信されるまで分配パターンを繰り返す。
例外処理
メッセージのキューへの配信に失敗した場合、ApsaraMQ for RocketMQは、配信失敗の原因に基づいて、キューが存在するノードを指定された期間スキップするかどうかを決定します。 この方法で、自動障害分離を実装できます。
特徴
ラウンドロビン負荷分散は、順序付けられていないメッセージに対してのみサポートされます。 このポリシーにより、メッセージが均等に分散され、トピックのパフォーマンスが最大化されます。
例:
デフォルトでは、順序付けられていないメッセージに対してラウンドロビン負荷分散が有効になっています。 次のサンプルコードは、ラウンドロビン負荷分散の例を示しています。
// By default, round-robin load balancing is enabled for normal messages.
// Send normal messages.
MessageBuilder messageBuilder = null;
for (int i = 0; i < 10; i++) {
// You do not need to configure round-robin load balancing to deliver normal messages. The SDK includes the logic that is required to perform round-robin messaging to evenly distribute messages.
Message message = messageBuilder.setTopic("normalTopic")
// Specify the message index key so that the system can use a keyword to accurately locate the message.
.setKeys("messageKey")
// Specify the message tag so that consumers can use the tag to filter the message.
.setTag("messageTag")
// Configure the message body.
.setBody("messageBody".getBytes())
.build();
try {
// Send the messages. Focus on the result of message sending and exceptions such as failures.
SendReceipt sendReceipt = producer.send(message);
System.out.println(sendReceipt.getMessageId());
} catch (ClientException e) {
e.printStackTrace();
}
}
MessageGroupHash
使用範囲
MessageGroupHashベースの負荷分散は、デフォルトの負荷分散ポリシーであり、ApsaraMQ forRocketMQで順序付きメッセージに対してサポートされている唯一の負荷分散ポリシーです。
ポリシーの仕組み
MessageGroupHashベースの負荷分散は、SipHashアルゴリズムを使用してメッセージを分散します。 MessageGroupHashベースの負荷分散モードでは、プロデューサーは組み込みのSipHashアルゴリズムに基づいて同じメッセージグループ内のメッセージを同じキューに送信し、同じメッセージグループ内のメッセージがメッセージの送信順にキューに格納されるようにします。
詳細については、「SipHash」をご参照ください。
上の図では、G1-M1はMessageGroup 1の最初のメッセージ、G1-M2は2番目のメッセージ、G1-M3は3番目のメッセージです。 プロデューサは、メッセージを同じキュー (MessageQueue 1) に送信し、3つのメッセージがメッセージの送信順序と同じ順序でキューに格納されるようにします。
特徴
MessageGroupHashベースの負荷分散は、順序付けられたメッセージに対してのみサポートされます。 この負荷分散ポリシーは、同じメッセージグループ内のメッセージの順序付き配信を保証します。
複数のメッセージグループのメッセージ数が大きく異なる場合、MessageGroupHashベースの負荷分散では、メッセージの均等な分散とパフォーマンススケーリングを保証できません。 特定のシナリオでは、MessageGroupHashベースの負荷分散により、ほとんどのメッセージが少数のキューに格納される場合があります。 多数のメッセージが少数のメッセージグループに格納されないように、メッセージを複数のメッセージグループに分散することを推奨します。
例:
既定では、順序付きメッセージに対してMessageGroupHashベースの負荷分散が有効になっています。 次のサンプルコードは、MessageGroupHashベースの負荷分散の例を示しています。
// By default, MessageGroupHash-based load balancing is enabled for ordered messages.
for (int i = 0; i < 10; i++) {
Message message = messageBuilder.setTopic("fifoTopic")
// Specify the message index key so that the system can use a keyword to accurately locate the message.
.setKeys("messageKey")
// Specify the message tag so that the consumer can filter the message based on the specified tag.
.setTag("messageTag")
// Configure MessageGroup. Messages in the same message group are distributed to the same queue based on the SipHash algorithm.
.setMessageGroup("fifoGroupA")
// Configure the message body.
.setBody("messageBody".getBytes())
.build();
try {
// Send the messages. Focus on the result of message sending and exceptions such as failures.
SendReceipt sendReceipt = producer.send(message);
System.out.println(sendReceipt.getMessageId());
} catch (ClientException e) {
e.printStackTrace();
}
}
バージョンの互換性
MessageGroupHash
MessageGroupHashベースのロードバランシングは、ApsaraMQ for RocketMQバージョン5.0以降でサポートされています。 ApsaraMQ forRocketMQバージョン4.xおよび3.xはこの機能をサポートしていません。
ApsaraMQ forRocketMQをバージョン4.xまたは3.xからバージョン5.xに更新する場合は、順序付きメッセージが同じ送信メカニズムを使用して、メッセージの順序付けの問題を防ぐようにしてください。 たとえば、消費者がRocketMQバージョン4.xまたは3.xのMessage Queueでトピック内のすべてのメッセージを消費するのを待ってから、バージョン5.xに更新できます。
ラウンドロビン
ラウンドロビンのロードバランシングでは、バージョン互換性の問題は発生しません。 ラウンドロビン負荷分散は、RocketMQバージョン3.x、4.x、および5.xのMessage Queueでサポートされています。
使用上の注意
MessageGroupHashベースのロードバランシングを使用する場合、キューのオーバーロードを回避
MessageGroupHashベースの負荷分散モードでは、ApsaraMQ for RocketMQは同じメッセージグループ内のメッセージを同じキューに配信します。 ほとんどのメッセージがプロデューサアプリケーション側の1つ以上のメッセージグループに格納されている場合、ApsaraMQ forRocketMQはメッセージを1つ以上のキューに配信します。 これは、サーバー側のストレージパフォーマンスに影響し、キューのオーバーロードを引き起こし、トピックパフォーマンスのスケーラビリティを妨げます。
メッセージを複数のメッセージグループに分散することを推奨します。 たとえば、電子商取引のシナリオで注文IDとユーザー名をメッセージグループのキーワードとして使用して、メッセージが複数のメッセージグループに分散され、ユーザー固有のメッセージが順番に処理されるようにすることができます。
1つのキューへのメッセージの送信を避ける
パフォーマンススケーリングとディザスタリカバリを確実にするために、順序付けられたメッセージと順序付けられていないメッセージの負荷分散に複数のキューを使用することを推奨します。 トピックにキューが1つしか含まれていない場合、負荷分散ポリシーに関係なく、メッセージはキューにのみ送信されます。 これにより、パフォーマンスのボトルネックの問題やディザスタリカバリの問題が発生します。