Go 重新使用卡夫卡信息的可能原因

Go 重新使用卡夫卡信息的可能原因,go,apache-kafka,kafka-consumer-api,sarama,Go,Apache Kafka,Kafka Consumer Api,Sarama,昨天,我从日志中发现卡夫卡在卡夫卡小组协调员启动小组再平衡后,正在重新收集一些消息。这些消息已在两天前通过日志确认被使用 日志中还报告了另外两个重新平衡,但他们不再收集消息。那么,为什么第一次重新切割会导致重新消费信息?有什么问题 我正在使用golang kafka客户端。这是密码 config := sarama.NewConfig() config.Version = version config.Consumer.Offsets.Initial = sarama.OffsetOldest

昨天,我从日志中发现卡夫卡在卡夫卡小组协调员启动小组再平衡后,正在重新收集一些消息。这些消息已在两天前通过日志确认被使用

日志中还报告了另外两个重新平衡,但他们不再收集消息。那么,为什么第一次重新切割会导致重新消费信息?有什么问题

我正在使用golang kafka客户端。这是密码

config := sarama.NewConfig()
config.Version = version
config.Consumer.Offsets.Initial = sarama.OffsetOldest 
我们在声明消息之前处理消息,所以我们似乎在为卡夫卡使用至少发送一次的策略。我们在一台机器上有三个代理,而在另一台机器上只有一个消费者线程执行例行程序

对这个凤凰有什么解释吗? 我认为这些消息一定已经提交了,因为它们是在两天前被消费的,或者为什么卡夫卡会在没有提交的情况下保留超过两天的偏移量

消费代码示例:

func (consumer *Consumer) ConsumeClaim(session 
sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {

for message := range claim.Messages() {
    realHanlder(message)   // consumed data here
    session.MarkMessage(message, "") // mark offset
}

return nil
}
增加:

重新平衡发生在应用程序重启后。还有另外两次重启没有停止

卡夫卡小说

log.retention.check.interval.ms=300000 log.retention.hours=168 zookeeper.connection.timeout.ms=6000 group.initial.rebalance.delay.ms=0 delete.topic.enable=true auto.create.topics.enable=false


通过阅读golang saram客户端和kafka服务器的源代码,我最终发现了如下原因

消费者组偏移保留时间为24小时,这是kafka的默认设置,而日志保留时间为7天,由我们明确设置

我的服务器应用程序运行在测试环境中,很少有人可以访问,这意味着kafka producer可能会生成很少的消息,然后消费者组会消费很少的消息,因此消费者可能不会长时间提交任何偏移量

由于偏移量配置的原因,消费偏移量未更新超过24小时时,kafka代理/协调器将从分区中删除消费偏移量。下次saram从kafka broker查询偏移量在哪里时,客户机当然什么也得不到。请注意,我们使用sarama.OffsetOldest作为初始值,然后sarama客户端将从kafka broker保存的消息开始使用消息,这将导致消息重新消耗,这很可能发生,因为日志保留时间为7天


当您使用最旧的偏移量时,您将从尚未提交的最旧偏移量中获取消息。你能分享你代码的使用阶段吗?你的服务器保留策略是什么?在重新平衡过程中,您的团队身份是否发生了变化?