消息发送方式缓存
想清楚Kafka发送的消息是否丢失,须要先了解Kafka消息的发送方式。安全
Kafka消息发送分同步(sync)、异步(async)两种方式网络
默认是使用同步方式,可经过producer.type属性进行配置;异步
Kafka保证消息被安全生产,有三个选项分别是0,1,-1async
经过request.required.acks属性进行配置:ide
0表明:不进行消息接收是否成功的确认(默认值);ui
1表明:当Leader副本接收成功后,返回接收成功确认信息;orm
-1表明:当Leader和Follower副本都接收成功后,返回接收成功确认信息;同步
六种发送场景it
两个维度相交,生成六种状况,以下图:


消息丢失的场景
网络异常
acks设置为0时,不和Kafka集群进行消息接受确认,当网络发生异常等状况时,存在消息丢失的可能;
客户端异常
异步发送时,消息并无直接发送至Kafka集群,而是在Client端按必定规则缓存并批量发送。在这期间,若是客户端发生死机等状况,都会致使消息的丢失;
缓冲区满了
异步发送时,Client端缓存的消息超出了缓冲池的大小,也存在消息丢失的可能;
Leader副本异常
acks设置为1时,Leader副本接收成功,Kafka集群就返回成功确认信息,而Follower副本可能还在同步。这时Leader副本忽然出现异常,新Leader副本(原Follower副本)未能和其保持一致,就会出现消息丢失的状况;
以上就是消息丢失的几种状况,在平常应用中,咱们须要结合自身的应用场景来选择不一样的配置。
想要更高的吞吐量就设置:异步、ack=0;想要不丢失消息数据就选:同步、ack=-1策略
附:Kafka备份策略,不理解的能够看个人另外一篇文章《Kafka消息的备份策略》

一个全栈程序猿的经验分享,你们以为有收获的请在评论中给个鼓励,不足之处也请多多指出;最后预祝你们开心永在,感谢您的关注。