1.Producer端:
丢失原因1:kafka在producer端的消息发送采用的是异步发送或者同步发送,可能因网络波动和消息太大超过了broker承受范围,导致丢失数据
解决方法:更换调用方式,使用带回调通知函数的方法进行发送,调整producer端重试次数和消息大小
丢失原因2:kafka默认ack设置为1/0
解决方法:修改ack设置为-1(结合幂等性做到Exactly Once)
2.broker端:
丢失原因:数据从producer端push过来后,broker端需要将数据持久化存储到磁盘中,消息存储是异步存储的,按照一定的消息数量和间隔时间进行存储,如果在存储的时候broker挂了,此时选举了一个落后Leader 很多的Follower成为新的Leader,那么落后的消息就会丢失
结局方法:修改参数,设置成为Leader的Follower落后太久的不要,设置分区数>=3(确保Leader挂了后Follower上任),设置消息至少要被写入成功到isr多少个副本才算已提交
3.consumer端:
丢失原因:consumer端拉取消息后最终处理完需要提交offset,有三种方式:
1)自动提交offset
2)拉去消息后,先提交offset再处理消息(如果处理消息的时候挂了,由于offset已经提交,consumer重启后会从之前提交的offset下一个位置开始消费,之前未处理的消息不会再次被处理,所以这部分消息已经丢失)
3)拉取消息后,先处理消息,再提交offset(如果在提交之前挂了,由于没有提交,所以consumer重启后会从上次提交的offset重新开始拉取消息,此时虽然不会丢失数据,但是会重复消费,这里只能业务自己保证幂等性)
解决方法:先拉取消息,再处理消息,再提交offset,并且设置参数enable.auto.commit = false 使用手动提交offset的方式。