目录
- 一、常见面试题
-
- 1、什么是`kafka`
- 2、`kafka`的设计是什么样的?
- 3、数据传输的事务定义有哪三种
- 4、`kafka`判断一个节点是否还活着
- 5、`producer` 是否直接将数据发送到`broker` 的 `leader`(主节点)?
- 6、kafka消息采用的是pull模式还是push模式?
- 7、kafka存储在硬盘上的消息格式是什么?
- 8、kafka高效文件存储设计特点
- 9、kafka与传统消息系统之间有三个关键区别
- 10、kafka创建 topic时如何将分区放置到不同的Broker中?
- 11、`kafka`新建的分区会在哪个目录下创建?
- 12、partition 的数据如何保存到硬盘?
- 13、kafka的 ack机制?
- 14、kafka的消费者如何消费数据?
- 15、消费者负载均衡策略?
- 16、数据有序?
- 17、kafka生产数据时的分组策略?
- 二、kafka技术概览
- 三、kafka核心组件
- 四、kafka核心特性
一、常见面试题
1、什么是kafka
kafka
是一个分布式消息队列Apache kafka
是一个开源消息系统
2、kafka
的设计是什么样的?
kafka
将消息以topic
为单位进行归纳;- 将向
kafka topic
发布消息的程序称为producers
(生产者); - 将预定
topic
并消费消息的程序称为consumer
(消费者); kafka
以集群方式运行,可以由一个或多个服务组成,每一个服务叫一个broker
(代理)producers
通过网络将消息发送到kafka
集群,集群向消费者提供消息
3、数据传输的事务定义有哪三种
-
最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输
- 先读取消息,然后将
offset
(偏移量)写入日志文件中,再处理消息,这存在一种可能,就是在存储offset
后换没处理消息就crash
(崩溃)了,新的consumer
从这个offset
继续处理
- 先读取消息,然后将
-
最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输
- 先读取消息,处理消息,最后记录
offset
,如果在记录offset
之前crash
,新的consumer
就会重复地消费一些消息。
- 先读取消息,处理消息,最后记录
-
精确的一次:不会漏传也不会重复传输,每个消息有且仅被传输一次,这是大家所期望的。
- 最简单的做法:将消息的
offset
和消息被处理后的结果保存在一起。分两个节点- 保存了
offset
后提交一次 - 消息处理成功后再提交一次
- 保存了
- 最简单的做法:将消息的
4、kafka
判断一个节点是否还活着
- 节点必须维护和
Zookeeper
的连接,Zookeeper
通过心跳机制检查每个节点的连接 - 如果节点是个
follower
(下级),它必须能及时地同步leader
(主节点)的写操作,延时不能太久
5、producer
是否直接将数据发送到broker
的 leader
(主节点)?
producer
直接将数据发送到broker
的 leader
,不需要在多个节点进行分发,为了帮助producer
做到这店,所有的kafka
节点都可以及时的告知:哪些节点是活动的,目标topic
目标分区的leader
在哪。这样producer
就可以直接将消息发送到目的地了。
6、kafka消息采用的是pull模式还是push模式?
kafka
消息采用的是pull
,它最初考虑的问题是,customer
(消费者)应该是从broker
拉取消息还brokers
将消息推送至customer
,也是就pull
还是push
。在这方面,kafka
遵循了一种大部分消息系统共同的传统的设计,producer
将消息推送到broker
,consumer
从broker
拉取消息。
一些消息系统比如scribe
和Apache Flume
采用push
模式,将消息推送到下游的consumer
。这样自拍有好处也有坏处:将broker
决定消息推送的速率,对于不同消费速率的consumer
就不太好处理了。消息系统都致力于让consumer
以最大的速率尽快消费消息,但不幸的是,push
模式下,当broker
推送的速率远大于consumer
消费的速率时,consumer
恐怕就要崩溃了。
pull
模式的另外一个好处是consumer
可以自主决定是否批量的从broker
拉取数据,可根据自己的消费能力去决定这些策略。
pull
有个缺点是,如果broker
没有可提供消费的信息,将导致consumer
不断在循环中轮询,知道新消息到达。为了避免这店,kafka
有个阐述可以让consumer
阻塞知道新消息到达。
7、kafka存储在硬盘上的消息格式是什么?
消息由一个固定长度的头部和可变长度的字节数组组成,头部包含了一个版本号和 CRC32
校验码
消息长度: 4bytes
( 1 + 4 + n)
- 1:版本号
- 4:CRC校验码
- n:具体的消息
8、kafka高效文件存储设计特点
kafka
把topic
中一个partition
大文件分成多个小文件段,通过小文件段,就容易定期清除或删除已消费完文件,减少磁盘占用- 通过索引信息可以快速定位
message
和确定response
的最大大小 - 通过
index
元数据全部映射到memory
,可以避免segment file
的磁盘IO
操作 - 通过索引文件稀疏存储,可以大幅降低文件元数据占用空间大小。
9、kafka与传统消息系统之间有三个关键区别
kafka
持久化日志,这些日志可以被重复读取和无限期保留kafka
是一个分布式系统:它以集群的方式运行,可以灵活伸缩,在内部通过复制数据提升容错能力和高可用性kafka
支持实时的流式处理。
10、kafka创建 topic时如何将分区放置到不同的Broker中?
- 副本因子不能大于
broker
个数 - 第一个分区(编号为0)的第一个副本位置是随机从
brokerList
选择的 - 其他分区的
第一个
副本防止位置相对于第0
个分区一次往后移。也就是如果我们有5
个broker
,5
个分区,假设第一个
分区放在第4
个broker
上,那么第二个
分区将会放在第五个
broker
上,第三个
分区放第一个
,第四个
放第二个
,依次类推 - 剩余的副本相对于
第一个
副本位置其实是由nextReplicaShift
决定的,而这个数也是随机产生的
11、kafka
新建的分区会在哪个目录下创建?
在启动kafka
集群之前,我们需要配置高log.dirs
参数,其值是kafka
数据的存放目录,这个参数可以配置多个目录,目录之间是有逗号隔离,通常这些目录是分布在不同磁盘上提高读写性能
当然我们也可以配置log.dir
参数,含义一样。只需要设置一个即可。
如果log.dirs
参数只配置了一个目录,那么分配到各个broker
上的分区肯定只能在这个目录下创建文件夹用于存放数据。