消費者進度管理
Apache RocketMQ 使用消費者偏移量來管理消費者的進度。本主題描述 Apache RocketMQ 的消費者進度管理機制。
背景
在 Apache RocketMQ 中,訊息可以在消費者訂閱之前或之後產生。因此,消費者如何知道從何處開始使用訊息,以及如何標記已使用的訊息?為了克服此挑戰,Apache RocketMQ 開發了消費者進度管理機制。
Apache RocketMQ 的消費者進度管理機制解決了以下問題
客戶端啟動後從何處開始使用訊息?
如何標記已使用的訊息以確保不會被多次處理?
如果發生服務例外狀況,訊息是否可以被同一個客戶端再次使用?
運作機制
訊息偏移量
在 Apache RocketMQ 中,訊息會依據到達順序在主題中排隊,並指派一個唯一的長整型座標。這也稱為訊息的偏移量。如需進一步了解這些概念的個別定義,請參閱 主題 和 訊息佇列。
理論上來說,訊息佇列可以儲存無限數量的訊息。因此,偏移量的值範圍從 0 到 Long.MAX_VALUE。您可以根據主題、佇列和偏移量找到任何訊息。下圖顯示這三個概念之間的關係。
在 Apache RocketMQ 中,佇列中最舊訊息的偏移量稱為最小偏移量 (MinOffset),最新訊息的偏移量稱為最大偏移量 (MaxOffset)。雖然訊息佇列理論上可以容納無限數量的訊息,但儲存它們的實體機器空間有限。因此,Apache RocketMQ 會動態刪除佇列中最舊的訊息,而佇列的 MinOffset 和 MaxOffset 值會持續增加。
消費者偏移量
Apache RocketMQ 遵循發布訂閱模式。多個消費者群組可以訂閱同一個佇列。在這種情況下,當消費者在使用訊息後將其刪除時,其他消費者將無法使用它。
為了防止這種情況發生,Apache RocketMQ 使用消費者偏移量來管理不同消費者的訊息使用進度。Apache RocketMQ 不會在使用訊息後立即刪除它。相反地,Apache RocketMQ 會記錄消費者群組使用的最新訊息,這也稱為消費者偏移量。
如果重新啟動客戶端,消費者可以根據儲存在伺服器中的消費者偏移量繼續處理訊息。如果消費者偏移量過期並被刪除,則會使用儲存在伺服器中的佇列 MinOffset 值作為消費者偏移量。
消費者偏移量會儲存到 Apache RocketMQ 伺服器並從中還原,且與任何特定消費者無關。因此,Apache RocketMQ 可以跨不同消費者還原消費者進度。
下圖顯示訊息佇列中最小偏移量、最大偏移量和消費者偏移量之間的關係。
消費者位移永遠小於或等於最大位移。
如果訊息生產和消費的速度相同,而且佇列中沒有未消費的訊息,則消費者位移與最大位移相同。
如果消費訊息的速度比生產訊息的速度慢,則佇列中會存在未消費的訊息。因此,消費者位移小於最大位移,兩者的差值就是未消費訊息的數量。
通常,消費者位移大於或等於最小位移。如果消費者位移小於最小位移,則消費者無法消費訊息。在這種情況下,伺服器會將正確的消費者位移還原給消費者。
初始消費者位移
當消費者群組第一次開始消費訊息佇列時,儲存在伺服器中的消費者位移就是初始消費者位移。
當消費者第一次從佇列中取得訊息時,Apache RocketMQ 會使用訊息佇列的最大位移作為初始消費者位移。換句話說,消費者會從佇列中的最新訊息開始消費。
重設消費者位移
如果初始或目前的消費者位移與您的業務狀態不符,您可以重設消費者位移來調整您的消費者進度。
場景
不正確的初始消費者位移:初始消費者位移是佇列的最大位移,也就是說,客戶端從最新訊息開始消費。如果您需要消費較早的訊息,您可以將消費者位移重設為較早訊息的位移。
消費者延遲:如果消費者無法跟上訊息產生的速度,可能會累積大量的訊息。如果累積的訊息並非任務關鍵,您可以將消費者位移調整為較大的值,以略過這些訊息並減輕下游負擔。
業務回溯和修正處理:如果您想要重新消費因業務錯誤而錯誤消費的訊息,您可以將消費者位移設定為較小的值。
消費者位移重設功能
Apache RocketMQ 的消費者位移重設功能讓您可以
將消費者位移重設為訊息佇列中的任何位移。
將消費者位移重設為特定的時間點。伺服器會將消費者位移調整為最接近時間點的位移。
限制
在重設使用者偏移量後,使用者會從新的偏移量開始使用訊息。在回溯情境中,使用者會從大多數為冷資料的歷史訊息開始。這會造成系統不必要的負擔,稱為冷讀取。在執行此操作前,請評估風險和好處。我們建議您實施嚴格的控制政策,以防止濫用和頻繁重設。
Apache RocketMQ 允許您僅重設可見訊息的使用者偏移量。您無法重設排程或重試中狀態的訊息偏移量。如需更多資訊,請參閱 延遲訊息 和 使用重試。
版本相容性
伺服器在不同版本的 Apache RocketMQ 中對初始使用者偏移量有不同的定義。
在 4.x 和 3.x 版本中,初始使用者偏移量定義為佇列的訊息狀態。
在 5.x 版本中,初始使用者偏移量是使用者開始接收訊息時佇列的最大偏移量。
因此,如果您從較早版本升級,則在啟動用戶端時必須注意初始使用者偏移量。
使用注意事項
嚴格控制重設權限
重設使用者偏移量會對系統造成額外的負擔,並可能影響訊息讀寫。因此,我們建議您在執行此操作前評估風險和好處。