繁体   English   中英

重用Kafka消息的可能原因

[英]Possible Reasons of Reconsuming Kafka Messages

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

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

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

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

而且我们在索取消息之前正在处理邮件,因此似乎我们对kafka使用了“最少发送一次”策略。 一台机器上有三个代理,而另一台机器上只有一个使用者线程(执行例程)。

对这种现象有什么解释吗? 我认为这些消息一定已经提交了,因为它们是两天前被消耗掉的,或者为什么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. Kafka的配置

    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服务器的源代码,终于找到了以下原因

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

  2. 我的服务器应用程序运行在很少有人可以访问的测试环境中,这意味着kafka生产者可能会产生很少的消息,然后消费者组几乎没有消息可以消费,因此消费者可能不会长时间提交任何补偿。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM