生产很难丢包,基本上是消费,消费逻辑如果不合理也会导致丢失。
检查下,ISR是否都同步,如果有副本不在isr中,切换状态,kafka重启后丢数据的可能性很大,如果原来的leader变成f,而原来的不在isr中的replica变成了l,这时候会有日志截断,这个部分的消息就丢了
生产者方面:当生产发送给kafka的消息超时了,这个时候其实是不知道消息kafka是不是已经接收到了。如果应用重发,则消息会重复,如果不发,那消息会丢失。
消费者方面:拿消费者获取一批数据之后,一批里面可能包含2000条或者更多,这时候有2种情况,直接提交offset。这时候如果应用宕机了,offset已经提交了,那这2000条就丢失了。如果应用程序处理完成这2000条,在提交,那么可能造成重复消费。
仔细想了下,不一定丢数据,中间态会查不到leader,但是生产和消费都应有响应的同步元数据和类似重试的机制,leader选举后会恢复