在 Kafka 中,当消费者配置为自动提交 Offset()时,Kafka 会在后台定期(由 控制,默认 5 秒)提交消费者已经拉取(poll)到的最大 Offset。 自动提交的核心问题在于:它只关心消息是否被拉取(fetch),完全不关心消息是否被成功处理(process)。 这种“拉取与处理脱节”的机制,在特定场景下必然会导致消息丢失或重复消费。 以下是具体的场景分析: --- 一、 导致“消息丢失”的情况(Offset已提交,但消息未处理完) 消息丢失的根本原因是:Offset 已经自动提交了,但消费者在处理完这些消息之前发生了崩溃。 1. 异步处理消息(最常见的丢失场景) 场景描述:主线程调用 拉取了一批消息,然后将这些消息丢给一个自定义的线程池(异步线程)去处理,主线程立刻循环调用下一次 。 触发丢失:因为主线程继续调用了 ,如果时间达到了 ,Kafka 就会把上一批消息的 Offset 自动提交。此时,如果系统突然宕机或重启,线程池里那些还在排队或正在处理的消息就会随着内存销毁而丢失。等应用重启后,Kafka 会从新提交的 Offset 开始发消息,之前没处理完的消...