生产者阶段重复
根本原因
生产发送的消息没有收到正确的broke响应,导致生产者重试。
生产者发出一条消息,broke落盘以后因为网络等种种原因发送端得到一个发送失败的响应或者网络中断,然后生产者收到一个可恢复的Exception重试消息导致消息重复。
过程
过程如下:
- new KafkaProducer()后创建一个后台线程KafkaThread扫描RecordAccumulator中是否有消息;
- 调用KafkaProducer.send()发送消息,实际上只是把消息保存到RecordAccumulator中;
- 后台线程KafkaThread扫描到RecordAccumulator中有消息后,将消息发送到kafka集群;
- 如果发送成功,那么返回成功;
- 如果发送失败,那么判断是否允许重试。如果不允许重试,那么返回失败的结果;如果允许重试,把消息再保存到RecordAccumulator中,等待后台线程KafkaThread扫描再次发送;
记录顺序问题
如果设置 max.in.flight.requests.per.connection
大于1(默认5,单个连接上发送的未确认请求的最大数量,表示上一个发出的请求没有确认下一个请求又发出了)