消息重复和丢失是kafka中很常见的问题,主要发生在以下三个阶段:
- 生产者阶段
- broke阶段
- 消费者阶段
生产者阶段重复场景
根本原因
生产发送的消息没有收到正确的broke响应,导致生产者重试。
生产者发出一条消息,broke落盘以后因为网络等种种原因发送端得到一个发送失败的响应或者网
络中断,然后生产者收到一个可恢复的Exception重试消息导致消息重复
说明:
- new KafkaProducer()后创建一个后台线程KafkaThread扫描RecordAccumulator中是否有消
息; - 调用KafkaProducer.send()发送消息,实际上只是把消息保存到RecordAccumulator中;
- 后台线程KafkaThread扫描到RecordAccumulator中有消息后,将消息发送到kafka集群;
- 如果发送成功,那么返回成功;
- 如果发送失败,那么判断是否允许重试。如果不允许重试,那么返回失败的结果;如果允许重
试,把消息再保存到RecordAccumulator中,等待后台线程KafkaThread扫描再次发送
可恢复异常说明
异常是RetriableException类型或者TransactionManager允许重试;RetriableException类继承关
系如下: