【问题标题】:How to determine Kafka topic partition offset if we haven't consumed any messages yet如果我们还没有消费任何消息,如何确定 Kafka 主题分区偏移量
【发布时间】:2020-07-24 04:59:43
【问题描述】:

librdkafka 包含函数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. 寻找已知位置(在错误恢复的情况下),或
  2. 搜索到分区的最后。

在这种情况下,我想知道的是下一条消息的偏移量是什么如果要被消费。换句话说,在第一种情况下,它应该是传递给rd_kafka_seek的相同偏移量,在第二种情况下,它应该是1加上rd_kafka_seek时分区中最后一条消息的偏移量调用。

不幸的是,正如评论所说,rd_kafka_position 不返回此信息。如果还没有消息被消费,它会给出-1001 (RD_KAFKA_OFFSET_INVALID)。如果我使用一条消息然后调用rd_kafka_position,它会给出正确的偏移量。

我是否可以调用其他函数来获取消费任何消息之前的偏移量?

【问题讨论】:

    标签: c apache-kafka librdkafka


    【解决方案1】:

    我不确定你在追求什么……“偏移”是消费者特定的东西,在大多数情况下(除了我在下面提到的两种情况)。它跟踪每个主题/分区的每个特定消费者的读取进度,如果该消费者尚未完成读取 - 该主题/分区还没有特定于消费者的偏移量。因此,在这种情况下,要求此消费者的偏移量没有任何意义 - 消费者尚未读取任何内容,因此没有与之关联的偏移量,它可以从您希望它开始的任何偏移量开始。

    与消费者无关的偏移量有用的两种主要情况是:

    • 当您知道要根据消息的时间或某些自定义的主题开始处理时 应用程序中的错误记录/报告
    • 或者当您想从主题中最早或最新的可用偏移量开始时

    如果您知道您希望消费者从哪个位置开始读取 - 您只需寻找该位置并让您的消费者从那时起开始消费消息。然后你可以通过询问它在任何时间点的偏移量来跟踪这个消费者的进度......

    如果你想从最早或最新的位置开始 - 你可以找出那个位置是什么(例如,在 2.5.x 版本中使用 KAfkaAdminClient.listOffsets() - 在 Java 中,我不知道知道什么是 Python 中的等效方法),然后再次寻找该位置并从它开始您的消费者。

    因此,简而言之,如果消费者从主题中读取了任何内容,您只能期望获得正确的偏移量;否则 - 唯一与消费者无关的有意义信息将是您确定的最早、最新或某些特定(已知)偏移量

    【讨论】:

    • 我的意思是我希望 Kafka 告诉我,如果消费者要消费一条消息,该消息的偏移量是多少。我不同意这没有意义的想法。 Kafka 显然知道这个数字是多少,否则,它将无法决定它应该发送给消费者的下一条记录是什么。
    • Kafka 不知道那个数字是多少直到你告诉它 - 通过从你希望它开始的特定偏移量开始你的消费者。一旦你启动了消费者——那么 Kafka 将在它的内部偏移主题中记录这一点——这意味着它现在“知道”你的消费者的位置——并且可以告诉你下次消费者在哪里
    • 如果消费者已经调用了rd_kafka_seek,那么 Kafka 代理必须知道消费者应该从哪个偏移量开始消费消息,并且应该有办法让 Kafka 给我该信息.
    • 换句话说,假设在时间 T2,您决定在某个主题/分区的位置 555 处开始您的消费者。如果您询问 Kafka 您的消费者将从什么位置/偏移开始,在某个时间 T1
    • 如果您在调用 rd_kafka_seek 之后存储了位置(为您的消费者提交了偏移量) - 是的,它会知道。如果你没有 - 卡夫卡没有记录
    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多