Apache kafka 卡夫卡手动抵销管理问题

Apache kafka 卡夫卡手动抵销管理问题,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,在实施手动抵销管理时,我遇到了以下问题:(使用0.9) 为了手动管理偏移量,对于每个消耗的记录,我检索记录的当前偏移量并提交新的偏移量(currentOffset+1,因为偏移量重置策略是“最新的”) 当创建一个新的使用者组时,它没有显式的偏移量(偏移量为“未知”),因此,如果它在停止之前没有使用所有现有分区中的消息,那么它将只拥有部分分区(使用者从中获取消息的分区)的提交偏移量,而其余分区的偏移量仍然是“未知的” 当使用者再次启动时,它只会获取关闭时生成的一些消息(仅来自具有已提交偏移量的分区

在实施手动抵销管理时,我遇到了以下问题:(使用0.9)

为了手动管理偏移量,对于每个消耗的记录,我检索记录的当前偏移量并提交新的偏移量(currentOffset+1,因为偏移量重置策略是“最新的”)

当创建一个新的使用者组时,它没有显式的偏移量(偏移量为“未知”),因此,如果它在停止之前没有使用所有现有分区中的消息,那么它将只拥有部分分区(使用者从中获取消息的分区)的提交偏移量,而其余分区的偏移量仍然是“未知的”

当使用者再次启动时,它只会获取关闭时生成的一些消息(仅来自具有已提交偏移量的分区的消息),来自偏移量为“未知”的分区的消息将丢失,并且由于偏移量重置策略,将永远不会被使用

因为在我的情况下,一旦创建了消费组,就不能错过任何消息,所以我希望在开始消费之前为每个分区显式地提交一个偏移量

为此,我找到了两种选择:

  • 使用低级使用者发送偏移请求
  • 使用高级使用者,调用consumer.poll(0)(以触发分配),然后调用consumer.assignment(),并为每个TopicPartition调用consumer.committed(TopicPartition);consumer.seekToEnd(主题分区);定位(topicPartition)并最终提交所有偏移量 两者都比我预期的更复杂、更嘈杂(我希望使用一个更简单的API来获取分配给使用者的所有分区的日志结束位置)

    如有任何关于更好实施的想法或想法,将不胜感激


    10倍。

    使用消费者API完全取决于您在哪里提交补偿

    • 如果您的偏移量存储在Kafka broker中,那么 您应该使用高级消费API,它将为您提供更多的控制 超过偏移量
    • 如果您在zookeeper中保留偏移量,则可以使用任何旧的使用者API,如
    列表>流 =consumer.createMessageStreamsByFilter(新白名单(topicRegex),1)


    我不确定,但可能有一些误解。为什么不使用“最早”的重置策略?听起来这会解决您的问题。这是要求。这个话题是一个已经存在的话题,有很多我不应该消费的老事件。需求是消费从消费者组创建之时起产生的所有消息。在我看来,方法(2)似乎是最佳实践。正如您所期望的,可能会有更多的代码,但我看不到一种更简单的方法来完成它,使用更高级别的API很可能比使用较低级别的API IMHO更好。但是,您可以通过使用
    endoffset()
    commit(offsetsandmata)
    (而不是
    seekToEnd()
    position()来简化代码
    提交()
    ),谢谢。endOffsets()仅在0.10中可用(我们仍然使用0.9)。我同意,我继续(2)。不过,我找到了另一种简化代码的方法,添加了ConsumerBalanceListener,并在PartitionsAssigned上运行这种代码的和平。稍微干净一点。