でRocketMQプロデューサーDefaultMQProducerの使用を理解するための記事、私たちは詳細にRockerMQプロデューサーの使用をご紹介します。この記事では、我々はRocketMQ消費者の使用をご紹介します。それぞれのプルあるRocketMQの消費者、DefaultMQPushConsumerとDefaultMQPullConsumerの2つの実装があり、モードとプッシュモード。中でも、プルモードは、消費者が積極的にリクエストを送信し、メッセージサーバーにアクセスして定期的にメッセージをプルするためのものです。プッシュモードは、長いポーリングメカニズムを使用します。消費者ポーリングモードは、サーバーブローカーに積極的にリクエストを送信します。ブローカーが、新しいメッセージはすぐに返されます。それ以外の場合、メッセージは一時的に返されず、リクエストはローカルにキャッシュされます。ブローカーには保留中のリクエストを検出するスレッドがあり、新しいメッセージがあると、リクエストに応答します。この記事では、主にDefaultMQPushConsumerの使用法を紹介します。
DefaultMQProducerプロデューサーが提供する複数のメッセージ送信APIと比較すると、DefaultMQPushConsumerが提供するメッセージ消費メソッドは比較的単純であり、メッセージ消費用のリスナーを登録するためのregisterMessageListenerメソッドを提供します。次のメソッドがDefaultMQPushConsumerによって提供されます。
//注册一个回调,在有消息存在时执行并发消费。
public void registerMessageListener(MessageListenerOrderly messageListener) {}
//注册一个回调,以便在消息到达时执行顺序消费。
public void registerMessageListener(MessageListenerConcurrently messageListener) {}
DefaultMQPushConsumerは、主に上記の2つの方法を使用して、メッセージプロデューサーからメッセージを送信します。以下はDefaultMQPushConsumerの例です。主にDefaultMQPushConsumerの構成に焦点を当てています。構成が異なれば、効果も異なる可能性があります。最初に例を見て、紹介します。コア構成、コードは次のとおりです。
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
//实例化消费者,传入消费者组,表示消费同一类消息
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("OnewayProducer");
//设置nameserver地址
consumer.setNamesrvAddr("127.0.0.1:9876");
//设置订阅的主图
consumer.subscribe("BenchmarkTest", "*");
//设置如何从何处开始消费
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//注册消息监听器,用于消费生产者生产的消息
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//启动消费者
consumer.start();
}
}
上記のコードは単純なRocketMQコンシューマーの例であり、コンシューマーのインスタンス化とnameServerの設定についてはここでは説明しません。以下は、RocketMQコンシューマーのコア構成です。
//订阅主题为topic的消息,并且可以通过subExpression过滤消息
public void subscribe(String topic, String subExpression){}
//订阅主题为topic的消息,可以订阅某Class实例的消息
public void subscribe(String topic, String fullClassName, String filterClassSource){}
//订阅主题为topic的消息,使用MessageSelector过滤消息
public void subscribe(final String topic, final MessageSelector messageSelector){}
//取消订阅主题为topic的消息
public void unsubscribe(String topic){}
//消息模型,支持集群消费和广播消费,默认为集群消费
public void setMessageModel(MessageModel messageModel){}
//Consumer 启动后,默认从什么位置开始消费,默认为CONSUME_FROM_LAST_OFFSET
public void setConsumeFromWhere(ConsumeFromWhere consumeFromWhere) {}
//集群模式下消息队列Rebalance 算法实现策略
public void setAllocateMessageQueueStrategy(AllocateMessageQueueStrategy allocateMessageQueueStrategy){}
//消费进度存储
public void setOffsetStore(OffsetStore offsetStore){}
//消费线程池数量的最大值
public void setConsumeThreadMax(int consumeThreadMax) {}
//消费线程池数量的最小值
public void setConsumeThreadMin(int consumeThreadMin){}
//单队列并行消费允许的最大跨度
public void setConsumeConcurrentlyMaxSpan(int consumeConcurrentlyMaxSpan){}
//默认值为1000,每1000次流控后打印流控日志
public void setPullThresholdForQueue(int pullThresholdForQueue) {}
//推模式下拉取任务间隔时间,默认一次拉取任务完成继续拉取
public void setPullInterval(long pullInterval) {}
//每次消息拉取拉取的消磁条数,默认为32条
public void setPullBatchSize(int pullBatchSize) {}
//消息并发消费时一次消费的消息条数
public void setConsumeMessageBatchMaxSize(int consumeMessageBatchMaxSize) {}
//是否每次拉取消息都更新订阅信息,默认为false
public void setPostSubscriptionWhenPull(boolean postSubscriptionWhenPull) {}
//最大消费重试次数
public void setMaxReconsumeTimes(final int maxReconsumeTimes){}
//延迟将队列的消息提交到消费线程的等待时长,默认为延迟1秒
public void setSuspendCurrentQueueTimeMillis(final long suspendCurrentQueueTimeMillis) {}
//信息消费超时时间,默认为15秒
public void setConsumeTimeout(final long consumeTimeout) {}
上記では、コンシューマーのコア構成を紹介しました。以下では、詳細な説明のために重要な構成を選択します。最初に、AllocateMessageQueueStrategyロードバランシング戦略の構成を紹介します。そのルートインターフェイスはAllocateMessageQueueStrategyです。以下に、次のクラス図に示すように、その実装を紹介します。
- AllocateMessageQueueAveragelyは均等に分散します。これは、デフォルトの戦略でもあります。
- AllocateMessageQueueAveragelyByCircleリング割り当て戦略
- AllocateMessageQueueByConfig手動構成
- AllocateMessageQueueConsistentHash一貫したハッシュ割り当て
- AllocateMessageQueueByMachineRoomマシンルーム割り当て戦略
配布戦略を紹介した後、クラスター消費とブロードキャスト消費をサポートするようにメッセージモデルを構成するために使用されるsetMessageModel構成を見てみましょう。デフォルトはクラスター消費です。MessageModelの定義は次のとおりです。
public enum MessageModel {
/**
* 广播,消费组中的每个消费者都可以消费所有消息
*/
BROADCASTING("BROADCASTING"),
/**
* 集群,消费组中的每个消费者都可以消费消息中的一部分消息
*/
CLUSTERING("CLUSTERING");
......
}
setConsumeFromWhereは、デフォルトで消費を開始する場所を構成するために使用されます。デフォルトはCONSUME_FROM_LAST_OFFSETです。ConsumeFromWhereの定義は次のとおりです。
public enum ConsumeFromWhere {
//从上次消费的位点开始消费,相当于断电继续
CONSUME_FROM_LAST_OFFSET,
//从ConsumeQueue最小位点开始消费
CONSUME_FROM_FIRST_OFFSET,
//从指定的时间开始消费
CONSUME_FROM_TIMESTAMP,
@Deprecated
CONSUME_FROM_LAST_OFFSET_AND_FROM_MIN_WHEN_BOOT_FIRST,
@Deprecated
CONSUME_FROM_MIN_OFFSET,
@Deprecated
CONSUME_FROM_MAX_OFFSET,
}
これ以上の消費者の例はここには示されません。実際、公式はRocketMQの使用例もたくさん書いています。興味があれば、公式のgithubの例を見つけることができます。RocketMQの高可用性については後で紹介します。