簡體   English   中英

Java:當我從kafka主題開始讀取時,如何從當前偏移量讀取

[英]Java: How to read from current offset when I start reading from a kafka topic

我正在使用Java api使用者連接器。 每當消費者開始從某個主題開始閱讀時,它都會從主題的開頭開始閱讀,並且要花很長時間才能趕上最新的事件。 我們如何確保消費者從當前偏移量中讀取數據?

最簡單的方法是在使用者配置中禁用自動提交(即auto.commit.enable=false ),並使用auto.offset.reset=latest (對於較舊的Kafka版本,請使用=largest )。

Kafka中的流程如下:

  1. 開始消費
  2. 消費者尋找有效的承諾犯罪
    • 如果找到,它將從那里繼續處理
    • 如果找不到,則根據“ auto.offset.reset”開始處理

因此,只要您的使用者組有一個有效的提交偏移量,“ auto.offset.reset”就根本不起作用。 因此,您也不應手動提交。

如果已經存在一個已提交的偏移量,那么如果要從當前偏移量讀取而不是處理舊數據,則需要在重新啟動使用者之前手動刪除它。 (或者使用一個新的group.id ,您知道它沒有提交的偏移量。)

作為所有替代方法,您還可以“尋求結束”使用者中的每個分區。 但這會使您的代碼更復雜,並且如果您的使用者組根本沒有提交,則可以避免。

對於kafka 0.10(可能更早),您可以執行以下操作:

properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
consumer = new KafkaConsumer<>(properties);
consumer.seekToEnd(Collections.emptySet());

這將關閉在代理上存儲消費者偏移量(因為您不使用它),並尋求所有分區的最新位置。

對於kafka 9:

  1. 如果您為消費者設置組ID,則kafka將為您存儲已提交(已處理)的偏移量。 如果您在kafka中使用新消費者,這將起作用。 閱讀更多
  2. 如果您始終要從最新的偏移量讀取數據,則可以指定OffsetResetStrategy.LATEST

為了完成Natalia的回答,我想說您可能並不關心存儲偏移量,您只想始終使用最新消息。

要使用大多數使用者實現(包括0.8.x中的“舊”使用者和0.9.x及更高版本中的“新”使用者)來實現該行為,您需要做兩件事:

  1. 將組ID設置為隨機值,這樣,您的消費者每次啟動時,都將無法從任何位置恢復偏移量,這將觸發“偏移量重置”請求。
  2. 設置OffsetRequestStrategy (或任何它被稱為在您使用客戶端)到latest ,這樣當您的客戶端請求從卡夫卡抵消它獲取日志中的最后一個(最新)消息所抵消。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM