kafka offset

一、Simple Consumer(或Low Level Consume)

1、手工管理offset

  1. 每次從特定Partition的特定offset開始fetch特定大小的消息
  2. 完全由Consumer應用程序決定下一次fetch的起始offset
  3. 使用Low Level Consume可以每次去指定希望消費消費哪個topic的那個partition多少offset之後的多少字節的消息,對於字節,如果指定的是100字節,那麼最多拿100字節,如果每條消息都超過100字節,那麼將拿不到任何消息,所以儘可能把字節上線設置大一點。

2、使用Low Level Consumer (Simple Consumer)的主要原因是,用戶希望比Consumer Group更好的控制數據的消費,如:

  1. 同一條消息讀多次,方便Replay,處理錯誤數據等
  2. 只消費某個Topic的部分Partition
  3. 管理事務,從而確保每條消息被處理一次(Exactly once)

3、與High Level Consumer相對,Low Level Consumer要求用戶做大量的額外工作

  1. 在應用程序中跟蹤處理offset,並決定下一條消費哪條消息
  2. 獲知每個Partition的Leader
  3. 處理Leader的變化
  4. 處理多Consumer的協作

二、High Level Consumer

  • 自動管理(提交)offset
    auto.commit.enable=true # 默認true
    auto.commit.interval.ms=60 * 1000 # 自動提交時機 單位 毫秒
  • 手工管理offset
    ConsumerConnector.commitOffsets();
  • offset存儲
    offsets.storage=zookeeper
    dual.commit.enabled=true

三、Log compaction

kafka的日誌,將就得數據刪除,如果kafka的日誌滿足時間或者超過某個大小,就把整個segment文件刪除了,但是做日誌壓縮,就不能直接刪除那個segment,因爲很有可能某個partition的offset一直沒有跟新,所以它在舊的那個segment裏面,如果直接將他刪除掉,那麼如果後面的想去讀這個consumer對每個partition的offset是多少,那麼就需要Log compaction。

Log compaction:
li
在上圖中,數字代表offset,Cleaner Point是一個清除點,左邊的數字不是連續的,它右邊的數字都是連續的。左邊的offset會被一個線程壓縮,而右邊的offset不會被處理。

2

Log compaction效果

  1. 一直保持消費Log head的consumer可按順序消費所有消息,並且offset連續
  2. 任何從offset 0開始的讀操作至少可讀到每個key對應的最後一條消息
  3. 每條消息的offset保持不變,offset是消息的永久標誌符
  4. 消費本身的順序不會被改變