为了账号安全,请及时绑定邮箱和手机立即绑定

Kafka消息重用的可能原因

Kafka消息重用的可能原因

Go
狐的传说 2023-06-26 18:02:00
昨天,我从日志中发现,在 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}添加:应用程序重新启动后发生重新平衡。还有另外两次重新启动并没有导致重新启动卡夫卡的配置log.retention.check.interval.ms=300000log.retention.hours=168zookeeper.connection.timeout.ms=6000group.initial.rebalance.delay.ms=0delete.topic.enable = trueauto.create.topics .enable=假
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

通过阅读golang saram客户端和kafka服务器的源码,最终找到原因如下

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

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

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


查看完整回答
反对 回复 2023-06-26
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信