对于主题的某些分区,kafka偏移和滞后是未知的

时间:2018-10-02 05:08:39

标签: go apache-kafka kafka-consumer-api confluent-kafka

enter image description here

我正在使用https://github.com/confluentinc/confluent-kafka-go的消费者。 kafka版本是0.10.1.0。

这是我的使用者的配置:

kafkaClient, err := kafka.NewConsumer(&kafka.ConfigMap{
    "bootstrap.servers":               broker,
    "group.id":                       "udwg20",
    "session.timeout.ms":              60000,
    "go.events.channel.enable":        true,
    "go.application.rebalance.enable": true,
    "default.topic.config": kafka.ConfigMap{
        "auto.offset.reset":      "earliest",
        "enable.auto.commit":      true,
        "auto.commit.interval.ms": 10000}})

一开始显示了所有的当前偏移量和滞后时间,但是运行了几个小时后,某些分区(未收到任何新消息)的偏移量和滞后时间变得未知。如果有消息到达其偏移和滞后未知的分区,则偏移和滞后将再次可见,并且消息将被使用。

当存在一些具有未知电流偏移和滞后的分区时,我重新启动使用者,这时,所有具有未知电流偏移和滞后状态的当前分区将从头开始再次消耗,但是其他分区似乎可以正常运行

我还使用了一个python使用者,它以不同的使用者组ID消耗了本主题中的消息。 python使用者似乎可以在没有未知电流偏移和滞后的任何分区的情况下正常工作。

2 个答案:

答案 0 :(得分:0)

offsets.retention.minutes用于清除不活动的消费者组。如果使用者组未提交offsets.retention.minutes的任何偏移量(默认为24h),kafka将清除其偏移量。这就是将offset和log设置为unknown的原因。

您可以增加偏移量的保留期限,但是请注意,老消费者将在__consumer_offsets主题中保留空间。

答案 1 :(得分:0)

我使用波纹管命令查看我的使用者组ID的偏移量是否定期提交。

echo exclude.internal.topics=false > consumer.properties

kafka-console-consumer --consumer.config consumer.properties --from-beginning --topic __consumer_offsets --zookeeper localhost:2181 --formatter "kafka.coordinator.GroupMetadataManager\$OffsetsMessageFormatter"

尽管我将enable.auto.commit的值设置为true,但是对于其lag = 0的分区,它不会定期提交。即使消费者组仍处于活动状态,这些分区的当前偏移量也会在2到3个小时后删除。

为解决此问题,我将enable.auto.commit设置为false,并编写了自己的函数,每隔5秒提交一次偏移量。

这是理想的选择: 当使用者收到新的Message事件或到达分区结尾(PartitionEOF)事件时,从事件数据中,我将最新的当前偏移量保留在提交映射中(键:{{1}值: topic_partition),并且具有定期(可能每5秒之后)提交此映射的功能。当使用者获得kafka.TopicPartition{ Topic, Partition, Offset }事件时,我从提交映射中删除了相应的密钥RevokedPartitions