簡體   English   中英

如果我們還沒有消費任何消息,如何確定 Kafka 主題分區偏移量

[英]How to determine Kafka topic partition offset if we haven't consumed any messages yet

librdkafka 包含 function rd_kafka_position ,它獲取給定主題分區的當前偏移量。 但評論說:

 The \p offset field of each requested partition will be set to the offset of the last consumed message + 1, or RD_KAFKA_OFFSET_INVALID in case there was no previous message.

換句話說,如果還沒有消息被消費,它不會給你任何有用的信息。

我對我剛剛訂閱了一個主題的情況感興趣,並且我已經調用rd_kafka_seek

  1. 尋找已知的 position(在錯誤恢復的情況下),或
  2. 尋找到分區的最后。

在這種情況下,我想知道的是,如果要消費一條消息,則下一條消息的偏移量是多少。 換句話說,在第一種情況下,它應該與傳遞給rd_kafka_seek的偏移量相同,在第二種情況下,它應該是 1 加上調用rd_kafka_seek時分區中最后一條消息的偏移量。

不幸的是,正如評論所說, rd_kafka_position不返回此信息。 如果還沒有消息被消費,它會給出-1001 ( RD_KAFKA_OFFSET_INVALID )。 如果我使用一條消息然后調用rd_kafka_position ,它會給出正確的偏移量。

我可以調用其他一些 function 以便在使用任何消息之前獲取偏移量嗎?

我不確定你在追求什么......“偏移”是消費者特定的東西,在大多數情況下(除了我在下面提到的兩種情況)。 它跟蹤每個主題/分區的每個特定消費者的讀取進度,如果該消費者尚未完成讀取 - 該主題/分區還沒有特定於消費者的偏移量。 因此,在這種情況下,要求此消費者的偏移量沒有任何意義 - 消費者尚未讀取任何內容,因此沒有與之關聯的偏移量,它可以從您希望它開始的任何偏移量開始。

與消費者無關的偏移量有用的兩種主要情況是:

  • 當您根據消息的時間或您在應用程序中的一些自定義錯誤記錄/報告知道要開始處理的主題中的哪些偏移量時
  • 或者當您想從主題中的 EARLIEST 或 LATEST 可用偏移量開始時

如果您知道您希望消費者開始閱讀的分區中的 position 是什么 - 您只需尋找 position 並讓您的消費者從那時起開始消費消息。 然后你可以通過詢問它在任何時間點的偏移量來跟蹤這個消費者的進度......

And if you want to start either from earliest or latest position - you can find out what that position is (using KAfkaAdminClient.listOffsets(), for example, in 2.5.x version - that is in Java, I don't know what is Python 中的等效方法),然后再次尋找該 position 並從中開始消費者。

因此,簡而言之,如果消費者從主題中讀取了任何內容,您只能期望獲得正確的偏移量; 否則 - 唯一與消費者無關的有意義信息將是您確定的最早、最新或某些特定(已知)偏移量

您應該能夠使用committed()。 也可以看看:

https://github.com/edenhill/librdkafka/issues/1964

暫無
暫無

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

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