八年面试生涯,整理了一套Kafka面试题

八年面试生涯,整理了一套Kafka面试题

 

1.Kafka 的设计时什么样的呢?面试

Kafka 将消息以 topic 为单位进行概括数组

将向 Kafka topic 发布消息的程序成为 producers.缓存

将预订 topics 并消费消息的程序成为 consumer.网络

Kafka 以集群的方式运行,能够由一个或多个服务组成,每一个服务叫作一个 broker.负载均衡

producers 经过网络将消息发送到 Kafka 集群,集群向消费者提供消息分布式

2.数据传输的事物定义有哪三种?性能

数据传输的事务定义一般有如下三种级别:fetch

(1)最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输ui

(2)最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输.设计

(3)精确的一次(Exactly once): 不会漏传输也不会重复传输,每一个消息都传输被一次而

且仅仅被传输一次,这是你们所指望的

3.Kafka 判断一个节点是否还活着有那两个条件?

(1)节点必须能够维护和 ZooKeeper 的链接,Zookeeper 经过心跳机制检查每一个节点的连

(2)若是节点是个 follower,他必须能及时的同步 leader 的写操做,延时不能过久

4.producer 是否直接将数据发送到 broker 的 leader(主节点)?

producer 直接将数据发送到 broker 的 leader(主节点),不须要在多个节点进行分发,为了

帮助 producer 作到这点,全部的 Kafka 节点均可以及时的告知:哪些节点是活动的,目标

topic 目标分区的 leader 在哪。这样 producer 就能够直接将消息发送到目的地了

五、Kafa consumer 是否能够消费指定分区消息?

Kafa consumer 消费消息时,向 broker 发出"fetch"请求去消费特定分区的消息,consumer

指定消息在日志中的偏移量(offset),就能够消费从这个位置开始的消息,customer 拥有

了 offset 的控制权,能够向后回滚去从新消费以前的消息,这是颇有意义的

六、Kafka 消息是采用 Pull 模式,仍是 Push 模式?

Kafka 最初考虑的问题是,customer 应该从 brokes 拉取消息仍是 brokers 将消息推送到

consumer,也就是 pull 还 push。在这方面,Kafka 遵循了一种大部分消息系统共同的传统

的设计:producer 将消息推送到 broker,consumer 从 broker 拉取消息

一些消息系统好比 Scribe 和 Apache Flume 采用了 push 模式,将消息推送到下游的

consumer。这样作有好处也有坏处:由 broker 决定消息推送的速率,对于不一样消费速率的

consumer 就不太好处理了。消息系统都致力于让 consumer 以最大的速率最快速的消费消

息,但不幸的是,push 模式下,当 broker 推送的速率远大于 consumer 消费的速率时,

consumer 恐怕就要崩溃了。最终 Kafka 仍是选取了传统的 pull 模式

Pull 模式的另一个好处是 consumer 能够自主决定是否批量的从 broker 拉取数据。Push

模式必须在不知道下游 consumer 消费能力和消费策略的状况下决定是当即推送每条消息还

是缓存以后批量推送。若是为了不 consumer 崩溃而采用较低的推送速率,将可能致使一

次只推送较少的消息而形成浪费。Pull 模式下,consumer 就能够根据本身的消费能力去决

定这些策略

Pull 有个缺点是,若是 broker 没有可供消费的消息,将致使 consumer 不断在循环中轮询,

直到新消息到 t 达。为了不这点,Kafka 有个参数可让 consumer 阻塞知道新消息到达

(固然也能够阻塞知道消息的数量达到某个特定的量这样就能够批量发

7.Kafka 存储在硬盘上的消息格式是什么?

消息由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和 CRC32

校验码。

消息长度: 4 bytes (value: 1+4+n)

版本号: 1 byte

CRC 校验码: 4 bytes

具体的消息: n bytes

8.Kafka 高效文件存储设计特色:

(1).Kafka 把 topic 中一个 parition 大文件分红多个小文件段,经过多个小文件段,就容易定

期清除或删除已经消费完文件,减小磁盘占用。

(2).经过索引信息能够快速定位 message 和肯定 response 的最大大小。

(3).经过 index 元数据所有映射到 memory,能够避免 segment file 的 IO 磁盘操做。

(4).经过索引文件稀疏存储,能够大幅下降 index 文件元数据占用空间大小。

9.Kafka 与传统消息系统之间有三个关键区别

(1).Kafka 持久化日志,这些日志能够被重复读取和无限期保留

(2).Kafka 是一个分布式系统:它以集群的方式运行,能够灵活伸缩,在内部经过复制数据

提高容错能力和高可用性

(3).Kafka 支持实时的流式处理

10.Kafka 建立 Topic 时如何将分区放置到不一样的 Broker 中

副本因子不能大于 Broker 的个数;

第一个分区(编号为 0)的第一个副本放置位置是随机从 brokerList 选择的;

其余分区的第一个副本放置位置相对于第 0 个分区依次日后移。也就是若是咱们有 5 个

Broker,5 个分区,假设第一个分区放在第四个 Broker 上,那么第二个分区将会放在第五

个 Broker 上;第三个分区将会放在第一个 Broker 上;第四个分区将会放在第二个

Broker 上,依次类推;

剩余的副本相对于第一个副本放置位置实际上是由 nextReplicaShift 决定的,而这个数也是

随机产生的

11.Kafka 新建的分区会在哪一个目录下建立

在启动 Kafka 集群以前,咱们须要配置好 log.dirs 参数,其值是 Kafka 数据的存放目录,

这个参数能够配置多个目录,目录之间使用逗号分隔,一般这些目录是分布在不一样的磁盘

上用于提升读写性能。

固然咱们也能够配置 log.dir 参数,含义同样。只须要设置其中一个便可。

若是 log.dirs 参数只配置了一个目录,那么分配到各个 Broker 上的分区确定只能在这个

目录下建立文件夹用于存放数据。

可是若是 log.dirs 参数配置了多个目录,那么 Kafka 会在哪一个文件夹中建立分区目录呢?

答案是:Kafka 会在含有分区目录最少的文件夹中建立新的分区目录,分区目录名为 Topic

名+分区 ID。注意,是分区文件夹总数最少的目录,而不是磁盘使用量最少的目录!也就

是说,若是你给 log.dirs 参数新增了一个新的磁盘,新的分区目录确定是先在这个新的磁

盘上建立直到这个新的磁盘目录拥有的分区目录不是最少为止。

12.partition 的数据如何保存到硬盘

topic 中的多个 partition 以文件夹的形式保存到 broker,每一个分区序号从 0 递增,

且消息有序

Partition 文件下有多个 segment(xxx.index,xxx.log)

segment 文件里的 大小和配置文件大小一致能够根据要求修改 默认为 1g

若是大小大于 1g 时,会滚动一个新的 segment 而且以上一个 segment 最后一条消息的偏移

量命名

13.kafka 的 ack 机制

request.required.acks 有三个值 0 1 -1

0:生产者不会等待 broker 的 ack,这个延迟最低可是存储的保证最弱当 server 挂掉的时候

就会丢数据

1:服务端会等待 ack 值 leader 副本确认接收到消息后发送 ack 可是若是 leader 挂掉后他

不确保是否复制完成新 leader 也会致使数据丢失

-1:一样在 1 的基础上 服务端会等全部的 follower 的副本受到数据后才会受到 leader 发出

的 ack,这样数据不会丢失

14.Kafka 的消费者如何消费数据

消费者每次消费数据的时候,消费者都会记录消费的物理偏移量(offset)的位置

等到下次消费时,他会接着上次位置继续消费

15.消费者负载均衡策略

一个消费者组中的一个分片对应一个消费者成员,他能保证每一个消费者成员都能访问,如

果组中成员太多会有空闲的成员

16.数据有序

一个消费者组里它的内部是有序的

消费者组与消费者组之间是无序的

17.kafaka 生产数据时数据的分组策略

生产者决定数据产生到集群的哪一个 partition 中

每一条消息都是以(key,value)格式

Key 是由生产者发送数据传入

因此生产者(key)决定了数据产生到集群的哪一个 partition

相关文章
相关标签/搜索