1.メッセージ送信モード
1.1同期送信
同期メッセージ送信モードは、メッセージが送信された後、プロデューサーがブローカーが応答するまで待機してから、次のメッセージの送信を続行することを意味します。
DefaultMQProducer producer = new DefaultMQProducer("my_producer_group");
producer.send(message); // 同步发送
返されるSendResultには、SEND OK(成功)、FLUSH_DISK_TIMEOUT(フラッシュタイムアウト)、FLUSH_SLAVE_TIMEOUT(同期タイムアウト)、SLAVE_NOT_AVAILABLE、の4つの状態があります。
1.2非同期送信
非同期送信とは、受信者が応答を返すのを待たずに送信者がデータを送信し、次のデータパケットを送信する通信方法を指します。
MQの非同期送信では、ユーザーは非同期送信コールバックインターフェイス(SendCallback)を実装する必要があります。メッセージ送信者がメッセージを送信した後、サーバーからの応答が返され、2番目のメッセージを送信するのを待つ必要はありません。送信者は、コールバックインターフェイスを介してサーバー応答を受信し、応答結果を処理します
DefaultMQProducer producer = new DefaultMQProducer("my_producer_group");
producer.send(msg, new SendCallback() {
@Override // 成功回调
public void onSuccess(SendResult sendResult) {
System.out.printf("%s%n",sendResult);
}
@Override // 失败回调
public void onException(Throwable throwable) {
throwable.printStackTrace();
}
});
1.3一方向伝送
一方向(一方向)送信は、送信者がサーバーの応答を待たずにメッセージの送信のみを担当し、コールバック関数がトリガーされない、つまり応答を待たずに要求を送信するだけであるという事実によって特徴付けられます。最も効率的な
DefaultMQProducer producer = new DefaultMQProducer("my_producer_group");
producer.sendOneway(msg);
1.4シーケンシャルトランスミッション
Kafkaでは、カスタムパーティション戦略を使用してメッセージを順番に送信できます。実現の原則は、同じタイプのメッセージを同じパーティションに送信することです。
RocketMQでは、 kafkaと同様のパーティション効果が、複数のメッセージキューに基づいて実現されます。トピックが送受信するデータ量が非常に多い場合は、処理速度を上げるために並列処理をサポートできるマシンが必要です。このとき、トピックは必要に応じて1つ以上のメッセージキューを設定できます。 。トピックに複数のメッセージキューがあると、メッセージを各メッセージキューに並行して送信でき、コンシューマーは複数のメッセージキューからのメッセージを並行して読み取って消費することもできます。
2.配布ルール
2.1デフォルトのルール
トピックには複数のメッセージキューがあるため、メッセージが同じキューにのみ送信されるように送信戦略をカスタマイズすることにより、プロデューサーのデフォルト構成が使用されている場合、プロデューサーは各メッセージキューに順番にメッセージを送信します。コンシューマーがメッセージを消費すると、負荷分散戦略に従って割り当てられたメッセージキューを消費します。
2.2カスタム
特定の設定がないと、特定のメッセージがどのメッセージキューに送信され、どのコンシューマーが消費するかがわかりません。たとえば、ビジネスで指定されたメッセージキューにメッセージを送信する必要がある場合は、同じタイプのメッセージを同じメッセージキューに送信します。シーケンシャルメッセージの機能を実現することは可能ですか?
kafkaと同様に、rocketMQもメッセージルーティングの機能を提供します。MessageQueueSelectorを実装することで、メッセージ配信戦略をカスタマイズし、独自のメッセージ配信戦略を実装できます。
DefaultMQProducer producer = new DefaultMQProducer("my_producer_group");
SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> list, Message message, Object o) {
int key=o.hashCode();
int size = list.size(); // 当前topic的消息队列数
int index = key%size; // 目标队列索引
return list.get(index); // list.get(0);
}
},"key_"+i);