Kafka 在什么情况下会出现消息丢失?

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的方式。

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值