Kafka手动抵消管理问题

时间:2017-02-20 15:20:11

标签: apache-kafka kafka-consumer-api

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

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

创建新的使用者组时,它没有明确的偏移量(偏移量为"未知"),因此,如果它在停止之前没有使用来自所有现有分区的消息,则将仅为部分分区(消费者从​​中获取消息的分区)提交偏移量,而其余分区的偏移量仍为“未知”#34;。

当再次启动使用者时,它只获得一些在它关闭时生成的消息(只有来自具有已提交偏移量的分区中的消息),来自分区的消息具有"未知&#34 ;由于偏移重置策略,偏移量将丢失并且永远不会消耗。

由于在我的情况下,一旦创建了一个使用者组,它就会错过任何消息是不可接受的,所以我希望在开始使用之前为每个分区显式提交一个偏移量。

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

  1. 使用低级别消费者发送偏移请求。
  2. 使用高级消费者,调用consumer.poll(0)(触发分配),然后调用consumer.assignment(),并为每个TopicPartition调用consumer.committed(topicPartition); consumer.seekToEnd(topicPartition); consumer.position(topicPartition)并最终提交所有偏移量。
  3. 两者都比我期望的更复杂和嘈杂(我期望使用更简单的API来获取分配给消费者的所有分区的日志结束位置。)

    任何有关更好实施的想法或想法都将受到赞赏。

    10倍。

1 个答案:

答案 0 :(得分:0)

使用消费者API完全取决于你在哪里提交抵消。

  • 如果您的抵消存入Kafka经纪人那么肯定 您应该使用高级消费者API,它将为您提供更多控制 过度补偿。
  • 如果您在zookeeper中保留偏移量,则可以使用任何旧的消费者API,例如
  

列表与LT; KafkaStream< byte [],byte []> >流   = consumer.createMessageStreamsByFilter(new Whitelist(topicRegex),1)