DefaultMQPushConsume消費者

DefaultMQPushConsumer,由系統控制拉取操作,即由rocket源碼從Broker,將消息拉取到消費者本地。消費者收到消息後,rocket源碼會自動調用傳人的處理方法來處理消息。

1.1 創建DefaultMQPushConsume消費者對象

// 指定組名
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name");

創建消費者對象的時候,一般會指定消費者組名groupName。下面是DefaultMQPushConsumer的各種配置屬性。

1.1.1 groupName和messageModel屬性

創建消費者對象的時候,一般會指定消費者組名。這個祖名groupName也就是訂閱組。一般情況下,假如有多個消費者,每一個消費者都使用相同的groupName,那麼這些消費者構成的就屬於一個組也就是訂閱組。Consumer的groupName用於把多個Consumer組織到一起,形成一個訂閱組,這樣訂閱組裏的每個消費者都會收到Topic裏面的消息。訂閱組裏的每一個消費者如何接收topic的消息則有messageModel決定。

//set to broadcast mode
consumer.setMessageModel(MessageModel.BROADCASTING);

RocketMQ 支持兩種消息模式: Clustering 和Broadcasting 。

  • 在Clustering 模式下,同一個ConsumerGroup(GroupName相同)裏的每個Consumer只消費所訂閱消息的一部分內容,同一個ConsumerGroup裏所有的Consumer 消費的內容合起來纔是所訂閱Topic 內容的整體,從而達到負載均衡的目的。
  • 在Broadcasting模式下,同一個ConsumerGroup裏的每個Consumer都能消費到所訂閱Topic的全部消息,也就是一個消息會被多次分發,被多個Consumer 消費。

1.1.2 ​​​​​​​consumerFromWhere屬性

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

public enum ConsumeFromWhere {
// 一個新的訂閱組第一次啓動從隊列的最後位置開始消費,後續再啓動接着上次消費的進度開始消費
    CONSUME_FROM_LAST_OFFSET,
    /** @deprecated */
    @Deprecated
    CONSUME_FROM_LAST_OFFSET_AND_FROM_MIN_WHEN_BOOT_FIRST,
    /** @deprecated */
    @Deprecated
    CONSUME_FROM_MIN_OFFSET,
    /** @deprecated */
    @Deprecated
    CONSUME_FROM_MAX_OFFSET,
// 一個新的訂閱組第一次啓動從隊列的最前位置開始消費,後續再啓動接着上次消費的進度開始消費
    CONSUME_FROM_FIRST_OFFSET,
// 一個新的訂閱組第一次啓動從指定時間點開始消費,後續再啓動接着上次消費的進度開始消費
//時間點設置參照DefaultPushConsumer.consumeTimestamp參數
    CONSUME_FROM_TIMESTAMP;

    private ConsumeFromWhere() {
    }
}

這個參數只對一個新的consumeGroup第一次啓動時有效,就是說,如果是一個consumerGroup重啓,他只會從自己上次消費到的offset,繼續消費。這個參數是沒用的。

1.1.3 ​​​​​​​topic和tag屬性

consumer.subscribe("TopicTest", "Tag1 || Tag2 || Tag3");

Topic名稱用來標識消息類型,需要提前創建。如果不需要消費某個Topic 下的所有消息,可以通過指定消息的Tag 進行消息過濾,比如:consumer.subscribe(”Topic Test”J ’tagl 11 tag2 11 tag3 ”),表示這個consumer 要消費“ TopicTest ”下帶有tagl 或tag2 或tag3 的消息( Tag 是在發送消息時設置的標籤)。在填寫Tag 參數的位置,用null 或者“*” 表示要消費這個Topic的所有消息。

1.1.4 ​​​​​​​consumerThreadMin和consumerThreadMax屬性

消費者使用一個 ThreadPoolExecutor 來處理內部的消費,因此您可以通過設置setConsumeThreadMin或setConsumeThreadMax來更改它,它的默認值爲20。這個屬性能夠增加消費者服務器的處理線程數,提高消費速度。

public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsumer {

    private final InternalLogger log = ClientLogger.getLog();

    //......

    /**
     * Minimum consumer thread number
     */
    private int consumeThreadMin = 20;

    /**
     * Max consumer thread number
     */
    private int consumeThreadMax = 20;

    public int getConsumeThreadMax() {
        return consumeThreadMax;
    }

    public int getConsumeThreadMin() {
        return consumeThreadMin;
    }

    //......
}

public class ConsumeMessageConcurrentlyService implements ConsumeMessageService {
    private static final InternalLogger log = ClientLogger.getLog();
    private final DefaultMQPushConsumerImpl defaultMQPushConsumerImpl;
    private final DefaultMQPushConsumer defaultMQPushConsumer;
    private final MessageListenerConcurrently messageListener;
    private final BlockingQueue<Runnable> consumeRequestQueue;
    private final ThreadPoolExecutor consumeExecutor;
    private final String consumerGroup;

    private final ScheduledExecutorService scheduledExecutorService;
    private final ScheduledExecutorService cleanExpireMsgExecutors;

    public ConsumeMessageConcurrentlyService(DefaultMQPushConsumerImpl defaultMQPushConsumerImpl,
        MessageListenerConcurrently messageListener) {
        this.defaultMQPushConsumerImpl = defaultMQPushConsumerImpl;
        this.messageListener = messageListener;

        this.defaultMQPushConsumer = this.defaultMQPushConsumerImpl.getDefaultMQPushConsumer();
        this.consumerGroup = this.defaultMQPushConsumer.getConsumerGroup();
        this.consumeRequestQueue = new LinkedBlockingQueue<Runnable>();
        // 創建線程池用來處理消息,consumeThreadMin、consumeThreadMax分別作爲核心線程數和最大線程數
        this.consumeExecutor = new ThreadPoolExecutor(
            this.defaultMQPushConsumer.getConsumeThreadMin(),
            this.defaultMQPushConsumer.getConsumeThreadMax(),
            1000 * 60,
            TimeUnit.MILLISECONDS,
            this.consumeRequestQueue,
            new ThreadFactoryImpl("ConsumeMessageThread_"));

        this.scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl("ConsumeMessageScheduledThread_"));
        this.cleanExpireMsgExecutors = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl("CleanExpireMsgScheduledThread_"));
    }

    //......

}

1.1.5 ​​​​​​​pullBatchSize和consumeMessageBatchMaxSize屬性

pullBatchSize是consumer每次從broker拉取的消息最大數,拉取後新消息先存儲到consumer內存中。而consumeMessageBatchMaxSize參數代表了,每次將內存中存儲的新消息(pullBatchSize參數拉取的消息)傳遞給開發者自定義的處理方法的最多條數,也是爲了提高消費速度的配置項。

consumer.setPullBatchSize(100);
consumer.setConsumeMessageBatchMaxSize(10);
consumer.registerMessageListener(new MessageListenerConcurrently() {
                // 使用list的方法
                public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                    for(MessageExt msg : msgs) {
                        System.out.println("-------->" + msg.getKeys());
                        System.out.println("-------->" + msg.getMsgId());
                        System.out.println("-------->" + msg.getQueueId());
                        System.out.println("-------->" + msg.getQueueOffset());
                        System.out.println("-------->" + msg.getBody().toString());
                        System.out.println("-------->" + msg.toString());
                    }
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                }
            });

1.1.6 instanceName屬性

假如一個項目裏面需要連接2個RocketMQ集羣,則單個MQClientInstance無法支持這種場景,一定要手動指定InstanceName,這時底層會創建兩個MQClientInstance對象。

consumer.setInstanceName()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章