RocketMQ(八)——Pull Or Push

在前面的博客已經提到,在RocketMQ中Consumer分爲2類:Push Consumer、Pull Consumer。以前的例子都是Push Consumer,接下來,介紹下Pull Consumer。
通過MQPullConsumerScheduleService進行操作

通過MQPullConsumerScheduleService進行操作

註冊回調並啓動

註冊回調並啓動

從表面意思上來看,好像Push是MQ推送給消費者,而Pull是消費者從MQ中拉取;其實本質上都是拉取模式PULL,即消費者從MQ中輪詢取得消息。

在Push模式下,Consumer把輪詢過程封裝了,並註冊了MessageListener監聽器,取到消息後,喚醒MessageListener監聽器中的consumeMessage()進行消費,所以給我們造成了感覺上好像是“推消息”。

在Pull模式下,需要特別注意的是,本質上是從一個Topic下的所有Queue進行拉取,而且每個Queue都必須記錄拉取位置,否則會導致重複消費。還有拉取的時間間隔,拉取的大小等等。不過所有的這一切,MQPullConsumerScheduleService都替我們考慮清楚了,提供updateConsumeOffset去更新消費的隊列的位置(默認5S同步一次),提供setPullNextDelayTimeMillis設置下次拉取的時間間隔(應該設置的大一些,至少大於5S)。

仔細回想下,對於Push方式的回調 和 Pull方式的回調,還有什麼關鍵區別麼?
對於Push而言,不論是基於MessageListenerConcurrently的,還是基於MessageListenerOrderly的,都有返回值的;而Pull的doPullTask的返回值卻是void?這意味,我們需要在pull方式中,注意自己處理每條消息消費的異常情況!

運行結果

運行結果
通過運行結果,可以印證上面的觀點:爲什麼每次消費都是4條開始,4條結束呢?因爲一個Topic下有4個Queue,而且上面的代碼實際上會針對每個Queue開啓一個線程去消費!

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