RocketMQコンシューマーDefaultMQPushConsumerの使用を理解するための記事

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の高可用性については後で紹介します。

おすすめ

転載: blog.csdn.net/wk19920726/article/details/108664429