Kafka 消息丢失与重复消费问题全解析:原因与解决方案
Kafka 作为分布式消息系统,消息的可靠性(不丢失)和一致性(不重复)是核心需求。但在实际使用中,由于配置不当、网络异常或故障处理等原因,可能出现消息丢失或重复消费的问题。本文将从消息丢失和重复消费两个维度,详细分析原因及解决方案。
消息丢失问题
消息丢失可能发生在生产者发送、Kafka 集群存储、消费者消费三个环节,需针对性解决。
生产者端消息丢失
原因分析
- acks 配置不当:
acks=0:生产者不等待 Kafka 确认,直接发送下一条消息。若 Broker 崩溃或网络中断,消息可能未写入磁盘而丢失。acks=1:仅 Leader 写入成功后确认。若 Leader 写入后未同步到 Follower 就崩溃,新 Leader(从 Follower 选举)会丢失该消息。
- 异步发送缓冲区溢出:
异步发送时,消息先存入缓冲区(buffer.memory),若缓冲区满且block.on.buffer.full=false(默认true已废弃,由max.block.ms替代),生产者会丢弃消息。 - 未启用重试机制:
网络波动等临时故障导致发送失败时,若retries=0,生产者不会重试,消息丢失。
解决方案
- 合理设置 acks:
关键业务场景设置acks=-1(或acks=all),确保 Leader 和所有 ISR 中的 Follower 均写入成功后才确认,从源头避免丢失。 - 优化异步发送配置:
- 设置
max.block.ms=60000(默认 60 秒),缓冲区满时阻塞等待,而非丢弃。 - 调整
buffer.memory(默认 32MB)和batch.size(默认 16KB),避免缓冲区频繁满溢。
- 设置
- 启用重试并合理配置:
- 设置
retries=3(默认重试次数极高,可根据业务调整),配合retry.backoff.ms=100(重试间隔),应对临时故障。
- 设置