MST

星途 面试题库

面试题:消息队列 Kafka 中消息重复消费的常见原因有哪些?

请详细阐述在 Kafka 消息队列场景下,可能导致消息重复消费的几种常见因素。
42.1万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

1. 生产者端

  • 幂等性未开启或未生效
    • Kafka 从 0.11.0.0 版本开始引入了生产者幂等性。如果生产者没有开启幂等性(enable.idempotence=true),在网络波动等情况下,生产者可能会收到 broker 端的不确定响应(比如超时但实际消息已成功写入),此时生产者会重试发送消息,导致 broker 端出现重复消息,进而消费者可能重复消费。即使开启了幂等性,如果超出了幂等性的保障范围(例如重启生产者且生产者的 PID 发生变化),也可能出现重复消息。
  • 事务未正确处理
    • 当生产者使用 Kafka 事务(transactional.id配置不为空)时,如果事务提交过程中出现异常(如网络故障、broker 短暂不可用等),生产者可能无法确定事务是否成功提交。若生产者错误地认为事务未成功而重新开启事务并发送相同消息,就会导致重复消息。例如,在事务中发送多条消息,其中部分消息发送成功但在提交事务时失败,生产者再次发起事务重发消息,会造成重复。

2. 消费者端

  • 自动提交偏移量机制
    • 消费者采用自动提交偏移量(enable.auto.commit=true)时,偏移量是定时提交(由auto.commit.interval.ms配置)。假设消费者在消费了一批消息后,还未来得及提交偏移量就发生了故障重启。当重启后,消费者会从上次提交的偏移量位置重新开始消费,这就导致刚刚消费过的那批消息被再次消费。
  • 手动提交偏移量异常
    • 当消费者手动提交偏移量时,如果在处理完消息后提交偏移量之前发生异常(如程序崩溃、网络问题导致与 broker 连接中断等),偏移量未能成功提交。当消费者恢复后,会再次从之前未提交偏移量的位置开始消费,造成消息重复消费。即使手动提交偏移量成功,但如果业务逻辑处理消息不是幂等的,在一些情况下(如重试机制触发)也可能重复处理相同消息。
  • 消费者组内分区再平衡
    • 当消费者组发生分区再平衡时(例如有新的消费者加入或离开组,或者 broker 发生故障导致分区重新分配),如果在再平衡前消费者没有及时提交偏移量,再平衡后新的消费者可能从之前未提交偏移量的位置开始消费,导致部分消息重复。例如,消费者 A 正在消费分区 P1 的消息,还未提交偏移量时,消费者 B 加入组,触发再平衡,消费者 A 停止消费,消费者 B 从消费者 A 未提交偏移量处开始消费,就会重复消费部分消息。

3. Kafka 集群端

  • 副本同步延迟
    • 在 Kafka 的多副本机制中,当 leader 副本接收到消息并成功写入后,会向生产者响应消息写入成功。如果 follower 副本同步消息延迟,而此时 leader 副本所在的 broker 发生故障,follower 副本成为新的 leader。由于新 leader 可能还未同步到部分消息,在故障恢复后,生产者可能会重新发送这些消息,导致重复。例如,leader 副本接收到消息 M1、M2、M3 并响应生产者,follower 副本只同步了 M1、M2,leader 故障后,新 leader 没有 M3,生产者重发 M3,就会出现重复。
  • 日志清理策略不当
    • Kafka 有两种日志清理策略:删除(delete)和压缩(compact)。如果采用删除策略,且retention.ms(消息保留时长)设置不合理,可能会导致消息在消费者还未来得及消费时就被删除。当消费者再次请求该消息时,可能会触发重复消费机制(比如重新拉取已删除但逻辑上应该存在的消息)。如果采用压缩策略,在一些边缘情况下(如消息 key 冲突但 value 不同且压缩过程异常),也可能导致消息重复或消费异常。