kafka面试知识点整理

1.kafka是什么?

kafka是一个分布式的消息中间件

2.kafka的优点? 为什么都在用kafka? 这都是一类问题

简单回答,只有三个词,异步 削峰 解耦
这三点可以展开来说,不过实际都是在说一回事

**异步:**生产者将消息丢到kafka中之后就不用管了,可以继续生产,消费者也不必成功消费后给生产者应答

**削峰:**由于有kafka的存在,访问到消费者端的数据量完全看消费者端的代码怎么写,因为kafka的数据消费,是由消费者主动去kafka上拉数据的,只要代码没问题,不会出现同一时段消费者端压力过大的问题

**解耦:**实际和异步是一回事,指生产者和消费者不再有强关联性,可以各忙各的,生产者继续生产,不关心消费情况,消费者继续消费,不用关心生产情况

也可以回答高可用,可靠性,高吞吐,低延迟,数据安全,可重复消费之类的,不过实际上都是一回事,对着kafka一顿猛夸就行了,这样回答可以进一步引导面试官问原理

3.kafka的工作原理?

技术分析的博客里有图,这里不用图,只写怎么回答
消息流向 生产者-kafka-消费者
kafka有两种模式,一种同步,一种异步
同步情况下,生产者producer给leader发消息,需要得到leader的ack应答,follower从机主动从leader上获取消息备份需要在完成备份后给leader一个ack应答 这种情况下,消息最不容易丢失,但是性能会下降
异步情况下,可以都不要ack应答,这种情况下,高吞吐,低延迟,性能最好,不过消息容易丢,适用于大数据场景,丢几条消息不影响最终的统计结果

接下来回答kafka内部的情况
kafka里面有多个broker,可以看成是多个服务器,这也是为什么高可用,一个挂了没关系
broker里面有多个topic ,对应消费者端不同的消费者组id
topic里面有多个分区 ,分区对应着消费者组中的消费者,一般情况下,分区数量要和消费者数量保持一致,因为分区数量大于消费者数量,会浪费kafka的资源,反过来,消费者配置多了,没有实际作用
分区又可以配置多个副本,防止消息的丢失
分区在服务器上实际就是文件夹,分区里面有多个segment
segment里面的文件类型 .index .indextime .log 三种
.log 就是存消息的地方
另外两种就是索引文件

4.消息的写入

一般消息写入磁盘非常消耗时间,kafka为什么性能这么好 这种问题就是在问消息是怎么写入的
kafka中的leader接到消息之后,会单独的开辟一块磁盘空间,将消息顺序写入,回答的重点只有这一句话

5.消息message的内部构成

1.offset kafka的消息状态维护只有offset,也可以理解成位置标识
2.消息大小
3.消息体 每一个消息体都是经历过压缩的

6.面试官最爱问的丢消息

上面说了kafka有两种模式,一种同步,一种异步,先明确这两种都会丢消息
同步丢消息:配置为1,只保证成功写入leader,不保证成功写入副本,在此前提下,生产者发消息给leader,follower还没来得及复制,而恰好leader的分区挂了,消息就会丢
异步丢消息:配置为0,异步情况下没有ack应答机制,当缓冲区满了,这个时候再进来消息,kafka默认就是会直接丢弃

如何避免
还是按照同步异步区分回答
同步丢消息:配置需要设置为-1,也就是说不仅要保证写入leader还要保证写入副本follower
异步丢消息:还是通过配置解决,需要设置kafka不限制消息的阻塞时间,也就是说,当缓冲区满了消息进来,让他一直阻塞住,反压生产者,让生产端一直阻塞,这种配置需要慎用,只适合对消息可靠性要求高的场景

上面是kafka自己丢消息,下面再加一种程序员造成的丢消息
消费者端的代码写的不好,也会导致丢消息,消费者端获取kafka里面的消息,有手动提交,自动提交,代码为手动提交,在处理消息时发生异常,恰巧finally中又会提交offset,这种情况也会丢消息

7.消息检索算法

消息的查找不是一步完成的,先找segment,再找offset,kafka中offset有序是检索的大前提
1.怎么找到segment
二分法
2.怎么找到offset
稀疏索引+二分法+顺序查找
由于消息检索的复杂度是o1 所以删除历史数据不会优化kafka性能

8.消息存储

时间上默认保存七天
数据量上有一个固定值1073741824
可以不记,知道这个是可以配置的就可以

9.为啥高可用,高容错

因为支持扩展,可以增加服务器数量,增加分区数量

10.去除zk的问题

新版的kafka不再用zk维护offset了,原因是性能不好,会导致消息的重复消费,具体原因是:每次消费者消费消息,都会向zk上报offset,在上报这个时间里,其他消费者很容易重复消费

去除zk后怎么维护offset
kafka单独定义了一个topic 名字_consumer_offset 用这个topic来自己维护offset

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值