Kafka消息重用的可能原因

昨天,我从日志中发现,在 Kafka 组协调员发起组重新平衡后,kafka 正在重新消费一些消息。这些消息已在两天前被消耗(从日志中确认)。

日志中还报告了另外两个重新平衡,但它们不再重新使用消息。那么为什么第一次重新平衡会导致重新消费消息呢?存在哪些问题?

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

config := sarama.NewConfig()
config.Version = version
config.Consumer.Offsets.Initial = sarama.OffsetOldest

并且我们在声明消息之前处理消息,所以我们似乎正在为 kafka 使用“至少发送一次”策略。我们在一台机器上有三个代理,在另一台机器上只有一个消费者线程(go 例程)。

对于这种现象有什么解释吗?我认为这些消息肯定已经提交了,因为它们是在两天前被消耗的,或者为什么 kafka 会在没有提交的情况下保留偏移量超过两天?

消费代码示例:

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

}

添加:

  1. 应用程序重新启动后发生重新平衡。还有另外两次重新启动并没有导致重新启动

  2. 卡夫卡的配置

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


狐的传说
浏览 87回答 1
1回答

ITMISS

通过阅读golang saram客户端和kafka服务器的源码,最终找到原因如下消费者组偏移保留时间为24 小时,这是 kafka 默认设置,而日志保留时间是我们明确设置的 7 天。我的服务器应用程序运行在测试环境中,很少有人可以访问,这意味着kafka生产者产生的消息可能很少,然后消费者组也没有多少消息可以消费,因此消费者可能很长时间不会提交任何偏移量。当消费偏移量超过24小时未更新时,由于偏移量配置,kafka代理/协调器将从分区中删除消费偏移量。下次 saram 从 kafka 代理查询偏移量在哪里时,客户端当然什么也得不到。请注意,我们使用sarama.OffsetOldest作为初始值,然后 sarama 客户端将从 kafka Broker 保留的消息开头开始消费消息,这会导致消息重新消费,并且这种情况很可能发生,因为日志保留期为 7天
打开App,查看更多内容
随时随地看视频慕课网APP