RocketMQ消費者消費位

consumer在消費時,會設置從哪裏開始消費。
默認是CONSUME_FROM_LAST_OFFSET
設置的值如代碼所示。

public enum ConsumeFromWhere {
    /**
     * 一個新的訂閱組第一次啓動從隊列的最後位置開始消費<br>
     * 後續再啓動接着上次消費的進度開始消費
     */
    CONSUME_FROM_LAST_OFFSET,

    @Deprecated
    CONSUME_FROM_LAST_OFFSET_AND_FROM_MIN_WHEN_BOOT_FIRST,
    @Deprecated
    CONSUME_FROM_MIN_OFFSET,
    @Deprecated
    CONSUME_FROM_MAX_OFFSET,
    /**
     * 一個新的訂閱組第一次啓動從隊列的最前位置開始消費<br>
     * 後續再啓動接着上次消費的進度開始消費
     */
    CONSUME_FROM_FIRST_OFFSET,
    /**
     * 一個新的訂閱組第一次啓動從指定時間點開始消費<br>
     * 後續再啓動接着上次消費的進度開始消費<br>
     * 時間點設置參見DefaultMQPushConsumer.consumeTimestamp參數
     */
    CONSUME_FROM_TIMESTAMP,
}

這裏要注意代碼註釋。這個參數只對一個新的consumeGroup第一次啓動時有效。
就是說,如果是一個consumerGroup重啓,他只會從自己上次消費到的offset,繼續消費。這個參數是沒用的。 而判斷是不是一個新的ConsumerGroup是在broker端判斷。
要知道,消費到哪個offset最先是存在Consumer本地的,定時和broker同步自己的消費offset。broker在判斷是不是一個新的consumergroup,就是查broker端有沒有這個consumergroup的offset記錄。

另外,對於一個新的queue,這個參數也是沒用的,都是從0開始消費。

所以,讓我們困惑的一個問題我已經設置了CONSUME_FROM_LAST_OFFSET,爲什麼還是重複消費了。
可能你這不是新的consumergroup,也可能是個新的Queue。

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