一线大厂面试真题-Kafka如何保证消息不丢失

本文详细解释了Kafka如何通过Producer的同步发送、重试机制,以及使用副本和acks参数来确保消息不丢失。副本机制和acks的不同设置对数据可靠性的影响也进行了深入剖析。
摘要由CSDN通过智能技术生成

目录

问题解答

面试点评


问题解答

(如图)kafka一个用来实现异步消息通信的中间件,它的整个架构由Producer、ConsumerBroker组成。

所以,对于kafka何保证消息不丢失这个问题,可以从三个方面来考虑和实现

首先是Producer端,需要确保消息能够到达Broker并实现消息存储,在这个层面,有可能出现网络问题,导致消息发送失败,所以,针对Producer端,可以通过2种方来避免消息丢失

1.   Producer默认是异步发送消息,这种情况下要确保消息发送成功,有两个方法

a.把异步发送改成同步发送,这样producer就能实时知道消息发送的结果。

b.添加异步回调函数来监听消息发送的结果,如果发送失败,可以在回调中重试。

2.   Producer本身提供了一个重试参数retries,如果因为网络问题或者Broker故障导致发送失败,Producer会自动重试。

然后是Broker端,Broker需要确保Producer发送过来的息不会丢失,也就是只需要把消息持久化到磁盘就可以了。

(如图)但是,Kafka为了提升性能,采用了异步批量刷盘的实现机制,也就是说按照一定的消息量和时间间隔来刷盘,而最终刷新到磁盘的这个动作,是由操作系统来调度的,所以如果在刷盘之前系统崩溃,就会导致数据丢失

(如图)Kafka并没有提供同步刷的实现,所以针对这个问题,需要通过Partition的副本机制和acks机制来一起解决。

我简单说一下Partition副本机制,它是针对每个数据分区的高可用策略,每个partition副本集包含唯一的一个Leader和多个FollowerLeader专门处理事务类的请求,Follower负责同步Leader的数据”。

在这样的一种机制的基础上,kafka提供了一个acks的参数,Producer可以设置acks参数再结合Broker的副本机制来个共同保障数据的可靠性。

acks有几个值的选择

1.   acks=0,表示producer不需要等Broker的响应,就认为消息发送成功,这种情况会存在消息丢失。

2.   acks=1,表示Broker中的Leader Partition收到消息以后,不等待其他Follower Partition同步完,就给Producer返回确认,这种情况下Leader Partition挂了,存在数据丢失。

3.   acks=-1,表示Broker中的Leader Partition收到消息后,并且等待ISR列表中follower同步完成,再给Producer返回确认,这个配置可以保证数据的可靠性。

最后,就是Consumer必须要能消费到这个消息,实际上,只要producerbroker的消息可靠的到了保障,那么消费端是不太可能出现消息无法消费的问题,除非是Consumer消费完这个消息就直接提交了,但是即便是这个情况,也可以通过调整offset的值来重新消费。

面试点

从高手的回答可以发现,任何的技术问题,是可以按照请求的顺序,或者调用关系来逐层推导去回答的。

当然,技术的底子要足够厚,至少像kafka里面这些副本、数据同步、分区、刷盘等功,至少都要有深度的思考和研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值