1. 程式人生 > >Kafka 訊息偏移量的維護

Kafka 訊息偏移量的維護

Kafka是大資料領域常用的訊息佇列,其高效的吞吐量和分散式容錯等特性是其收到青睞的重要原因。

kafka訊息的位置

用好Kafka,維護其訊息偏移量對於避免訊息的重複消費與遺漏消費,確保訊息的Exactly-once是至關重要的。
kafka的訊息所在的位置Topic、Partitions、Offsets三個因素決定。
Kafka消費者消費的訊息位置還與consumer的group.id有關。

consumerOffsets與earlieastLeaderOffsets的關係

名稱 含義
earlieastLeaderOffsets 儲存在broker上的leader節點的最早的訊息偏移量
consumerOffsets 消費者消費的訊息偏移量位置

為了表述方便,我們記earlieastLeaderOffsets為A,記consumerOffsets為B 。

  • 情況一:正常情況下,消費的訊息偏移量應該大於broker上儲存的最早的訊息偏移量,即 A < B:
    這裡寫圖片描述

我們知道,儲存在broker上的kafka的訊息常設定訊息過期配置,當到達過期時間時過期的訊息將會被清除。

  • 情況二:如果A 依然小於 B,則仍可以正常消費:
    這裡寫圖片描述

  • 情況三:然而,當 A > B 時,則說明還沒有被消費的訊息已經被清除:
    這裡寫圖片描述
    此種情況會丟擲 kafka.common.OffsetOutOfRangeException

    異常。

consumerOffsets 小於 earlieastLeaderOffsets的影響與解決辦法

當情況三發生時,在(B,A)區間內的訊息還沒有被消費就已經被清除了,將導致兩個後果。
1. 訊息丟失。
2. 丟擲 kafka.common.OffsetOutOfRangeException 異常。

在對訊息完整性有嚴格要求的系統中,訊息的丟失造成的影響會比較嚴重,所以在這種情況下,要保證訊息不會遭到丟失。
避免訊息丟失包含兩個方面:

  • 還沒有被消費過的訊息不會被清除。
    在沒有外部系統清除kafka訊息的情況下,協調設定broker的最大保留大小 log.retention.bytes
    和 最大保留時間log.retention.hours 等,來配合消費者端的讀取訊息。可以通過讀取和監控消費者消費的offsets,來保證訊息不會被意外清除。
  • 消費者端消費訊息沒有遺漏。
    當消費者意外中斷時,重新啟動消費時能夠從上一次中斷的訊息偏移量開始消費。