Kafka面试系列-03

2022年7月17日
大约 8 分钟

Kafka面试系列-03

1. Kafka 新建分区时在哪个目录下创建?

在启动Kafka集群之前,需要配置log.dirs参数,其值是Kafka数据的存放目录,这个参数可以配置多个目录,目录之间使用逗号分隔,通常这些目录是分布在不同的磁盘上用于提高读写性能。

当然也可以配置log.dir参数,含义一样。只需要设置其中一个即可。

如果log.dirs参数只配置了一个目录,那么分配到各个Broker上的分区肯定只能在这个目录下创建文件夹用于存放数据。

但是log.dirs参数配置多个目录,那么Kafka会在哪个文件夹中创建分区目录?

Kafka会在含有分区目录最少的目录中创建新的分区目录,分区目录名为Topic名+分区ID。注意的是分区文件夹总数最少的目录,而不是磁盘使用量最少的目录!也就是说,如果用户给log.dirs参数新增了一个新的磁盘,新的分区目录肯定是先在这个新的磁盘上创建直到这个新的磁盘目录拥有的分区目录不是最少为止。

2. Kafka 中 partition 的数据如何保存到硬盘?

topic中的多个partition以文件夹的形式保存到broker,每个分区序号从0递增,且消息有序 Partition文件下有多个segment(xxx.index,xxx.log)segment文件里的大小和配置文件大小一致可以根据要求修改 默认为1g。如果大小大于1g时,会滚动一个新的segment并且以上一个segment最后一条消息的偏移量命名。

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

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

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

版本号: 1 byte

CRC校验码: 4 bytes

具体的消息: n bytes

4. Kafka 消息是采用 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阻塞知道新消息到达。(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发)

5. 数据传输的事务定义有哪三种?

和 MQTT 的事务定义一样都是3种。

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

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

3)精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输一次,这是大家所期望的。

6. Kafka 能否脱离 Zookeeper 单独使用吗?为什么?

kafka不能脱离zookeeper单独使用,因为kafka使用zookeeper管理和协调kafka的节点服务器。

7. 为什么说 Kafka 性能很好,体现在哪里?

①顺序读写

②零拷贝

③分区

④批量发送

⑤数据压缩

8. 使用 Kafka 有什么优点和缺点?

kafka优点:

①支持跨数据中心的消息复制;

②单机吞吐量:十万级,最大的优点,就是吞吐量高;

③topic数量都吞吐量的影响:topic从几十个到几百个的时候,吞吐量会大幅度下降。所以在同等机器下,kafka尽量保证topic数量不要过多。如果要支撑大规模topic,需要增加更多的机器资源;

④时效性:ms级;

⑤可用性:非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用;

⑥消息可靠性:经过参数优化配置,消息可以做到0丢失;

⑦功能支持:功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用。

kafka缺点:

①由于是批量发送,数据并非真正的实时; 仅支持统一分区内消息有序,无法实现全局消息有序;

②有可能消息重复消费;

③依赖zookeeper进行元数据管理,等等。

9. Kafa consumer 是否可以消费指定分区消息?

Kafa consumer消费消息时,向broker发出"fetch"请求去消费特定分区的消息,consumer指定消息在日志中的偏移量(offset),就可以消费从这个位置开始的消息,customer拥有了offset的控制权,可以向后回滚去重新消费之前的消息。

10. producer 是否直接将数据发送到 broker 的 leader?

producer直接将数据发送到broker的leader(主节点),不需要在多个节点进行分发,为了帮助producer做到这点,所有的Kafka节点都可以及时的告知:哪些节点是活动的,目标topic目标分区的leader在什么位置。这样producer就可以直接将消息发送到目的地了。

11. Kafka 中 message 包括哪些信息?

一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成。

header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。当magic的值为1的时候,会在magic和crc32之间多一个字节的数据:attributes(保存一些相关属性,比如是否压缩、压缩格式等等);如果magic的值为0,那么不存在attributes属性。

body是由N个字节构成的一个消息体,包含了具体的key/value消息。

12. Kafka 有什么优势及应用场景都有哪些?

Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。简单地说,Kafka就相比是一个邮箱,生产者是发送邮件的人,消费者是接收邮件的人,Kafka就是用来存东西的,只不过它提供了一些处理邮件的机制。

一、Kafka的优势如下:

高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒;

可扩展性:kafka集群支持热扩展;

持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;

容错性:允许集群中节点故障(若副本数量为n,则允许n-1个节点故障);

高并发:支持数千个客户端同时读写。

二、Kafka适合以下应用场景:

日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer;

消息系统:解耦生产者和消费者、缓存消息等;

用户活动跟踪:kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后消费者通过订阅这些topic来做实时的监控分析,亦可保存到数据库;

运营指标:kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告;

流式处理:比如spark streaming和storm。