RocketMq如何順序消費的訊息offest

一懶眾衫小QAQ發表於2022-02-06

RocketMq對於消費者對於訊息的如何處理的

1:如果設定了自動提交

返回:

ConsumeOrderlyStatus.COMMIT, ConsumeOrderlyStatus.ROLLBACK, ConsumeOrderlyStatus.SUCCESS , 返回者三種狀態都是會提交offset,

但是返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT 會校驗是否重試。達到重試次數(達到設定的重試次數會投遞到重試佇列,見下文)還是失敗也會提交offest;

image2022-1-23_16-55-46

2:如果是非自動提交:

只有返回commit才會提交offest,返回其他的狀態都不會commit offest

返回:SUSPEND_CURRENT_QUEUE_A_MOMENT 需要重試的時候是不會繼續消費,達到重試次數也不會提交offest。

image2022-1-23_16-56-20

判斷方法主要獲取最大的重試次數和當前訊息的重試次數對比,如果達到了最大的重試次數就是執行 sendMessageBack 方法。這個方法將訊息傳送到重試佇列中,稍後進行重試(還是失敗及時投遞到死信DLQ佇列中)

傳送失敗,訊息會繼續重試。

如果當前重試次數小於最大重試次數,則繼續阻塞重試。

image2022-1-23_16-56-41

這個是獲取最大重試次數的方法,當沒有設定重試次數 (預設 -1) 就重試Integer的最大值。否則以設定為準。

下面這段邏輯是達到重試次數後投遞到重試佇列的邏輯。

image2022-1-23_16-8-50

重試佇列的topic:%RETRY%+{消費者組的名稱}

順序訊息消費種對於順序強要求的,需要消費失敗阻塞消費的,可以設定非自動提交,然後捕獲異常,只有消費成功才進行commit;

相關文章