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