Kafka相关面试问题集锦

1. 消费者获取消息有几种模式?

消费者获取消息有两种模式:推送模式和拉取模式。

2. RocketMQ 的特点有哪些?

支持严格的消息顺序支持Topic与Queue两种模式亿级消息堆积能力比较友好的分布式特性同时支持Push与Pull方式消费消息。

3. Kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 Kafka 将如何处理?

这个时候 Kafka 会执行数据清除工作,时间和大小不论满足哪个条件,都会清空数据。

4. 为何需要Kafka集群?

本地开发,一台Kafka足够使用。在实际生产中,集群可以跨服务器进行负载均衡,再则可以使用复制功能来避免单独故障造成的数据丢失。同时集群可以提供高可用性。

5. Kafka 的数据存储设计是什么?

  • partition 的数据文件(offset,MessageSize,data)。
  • partition 中的每条 Message 包含了以下三个属性:offset,essageSize,data,其中 offset 表示 Message 在这个 partition 中的偏移量,offset 不是该 Message 在 partition 数据文件中的实际存储位置,而是逻辑上一个值,它唯一确定了 partition 中的一条 Message,可以认为 offset 是 partition 中 Message 的 id;MessageSize 表示消息内容 data 的大小;data 为 Message 的具体内容。
  • 数据文件分段 segment(顺序读写、分段命令、二分查找)。
  • partition 物理上由多个 segment 文件组成,每个 segment 大小相等,顺序读写。每个 segment 数据文件以该段中最小的 offset 命名,文件扩展名为.log。这样在查找指定 offset 的 Message 的时候,用二分查找就可以定位到该 Message 在哪个 segment 数据文件中。
  • 数据文件索引(分段索引、稀疏存储)。
  • Kafka 为每个分段后的数据文件建立了索引文件,文件名与数据文件的名字是一样的,只是文件扩展名为.index。index 文件中并没有为数据文件中的每条 Message 建立索引,而是采用了稀疏存储的方式,每隔一定字节的数据建立一条索引。这样避免了索引文件占用过多的空间,从而可以将索引文件保留在内存中。

6. Kafka 如何判断一个节点是否存活?

(1)节点必须可以维护和ZooKeeper的连接,Zookeeper通过心跳机制检查每个节点的连接。

(2)如果节点是个follower,他必须能及时的同步leader的写操作,延时不能太久。

7. Kafka 消息发送的可靠性机制有几种?

生产者向 Kafka 发送消息时,可以选择需要的可靠性级别。通过 acks 参数的值进行设置。

(1)0 值 异步发送。生产者向 Kafka 发送消息而不需要 Kafka 反馈成功 ack。该方式效率最高,但可靠性最低。其可能会存在消息丢失的情况。

(2)1 值 同步发送,默认值。生产者发送消息给 Kafka,broker 的 partition leader 在收到消息后马上发送成功 ack(无需等待 ISR 中的 follower 同步完成),生产者收到后知道消息发送成功,然后会再发送消息。如果一直未收到 Kafka 的 ack,则生产者会认为消息发送失败,会重发 消息。

(3)-1 值 同步发送。其值等同于 all。生产者发送消息给 Kafka,Kafka 收到消息后要等到 ISR 列表中的所有副本都同步消息完成后,才向生产者发送成功 ack。如果一直未收到 Kafka 的 ack,则认为消息发送失败,会自动重发消息。

该方式存在 follower 重复接收的情况。但是,重复接收与重复消费是两个概念。

8. 请详细说一下推送模式和拉取模式。

(1)PushConsumer

  • 推送模式(虽然 RocketMQ 使用的是长轮询)的消费者。消息的能及时被消费。使用非常简单,内部已处理如线程池消费、流控、负载均衡、异常处理等等的各种场景。

(2)PullConsumer

  • 拉取模式的消费者。应用主动控制拉取的时机,怎么拉取,怎么消费等。主动权更高。但要自己处理各种场景。

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

(1)Kafka 持久化日志,这些日志可以被重复读取和无限期保留。

(2)Kafka 是一个分布式系统:它以集群的方式运行,可以灵活伸缩,在内部通过复制数据提升容错能力和高可用性。

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

10. RocketMQ 由哪些角色组成?

  • 生产者(Producer):负责产生消息,生产者向消息服务器发送由业务应用程序系统生成的消息。
  • 消费者(Consumer):负责消费消息,消费者从消息服务器拉取信息并将其输入用户应用程序。
  • 消息服务器(Broker):是消息存储中心,主要作用是接收来自  Producer 的消息并存储,Consumer 从这里取得消息。
  • 名称服务器(NameServer):用来保存 Broker 相关 Topic 等元信息并给 Producer ,提供 Consumer 查找 Broker 信息。

11. Kafka 的消费者如何消费数据?

消费者每次消费数据的时候,消费者都会记录消费的物理偏移量(offset)的位置等到下次消费时,他会接着上次位置继续消费。

12. Kafka 的优点是什么?

  • 多生产者和多消费者
  • 基于磁盘的数据存储,换句话说,Kafka的数据天生就是持久化的。
  • 高伸缩性,Kafka一开始就被设计成一个具有灵活伸缩性的系统,对在线集群的伸缩丝毫不影响整体系统的可用性。
  • 高性能,结合横向扩展生产者、消费者和 broker,Kafka 可以轻松处理巨大的信息流,同时保证亚秒级的消息延迟。

13. Kafka 的设计时什么样的?

  • Kafka 将消息以 topic 为单位进行归纳。
  • 将向 Kafka topic 发布消息的程序成为 producers。
  • 将预订 topics 并消费消息的程序成为 consumer。
  • Kafka 以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个 broker。producers 通过网络将消息发送到 Kafka 集群,集群向消费者提供消息。

14. 说说你对 Consumer 的了解。

(1)获得Topic-Broker的映射关系。Consumer启动时需要指定Namesrv地址,与其中一个Namesrv建立长连接。消费者每隔30秒从Namesrv获取所有Topic的最新队列情况,Consumer跟Broker是长连接,会每隔30秒发心跳信息到Broker。

(2)消费者端的负载均衡。根据消费者的消费模式不同,负载均衡方式也不同。

15. Kafka 新建的分区会在哪个目录下创建?

在启动 Kafka 集群之前,我们需要配置好log.dirs参数,其值是 Kafka 数据的存放目录,这个参数可以配置多个目录,目录之间使用逗号分隔,通常这些目录是分布在不同的磁盘上用于提高读写性能。当然我们也可以配置log.dir参数,含义一样。只需要设置其中一个即可。如果log.dirs参数只配置了一个目录,那么分配到各个Broker上的分区肯定只能在这个目录下创建文件夹用于存放数据。但是如果log.dirs参数配置了多个目录,那么 Kafka 会在哪个文件夹中创建分区目录呢?

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

16. 说一下 Kafka 消费者消费过程。

生产者将消息发送到 topic 中,消费者即可对其进行消费,其消费过程如下:

(1)consumer 向 broker 集群提交连接请求,其所连接上的任意 broker 都会向其发送 broker controller 的通信 URL,即 broker controller 主机配置文件中的 listeners 地址。

(2)当 consumer 指定了要消费的 topic 后,其会向 broker controller 发送 poll 请求。

(3)broker controller 会为 consumer 分配一个或几个 partition leader,并将该 partitioin 的当前 offset 发送给 consumer。

(4)consumer 会按照 broker controller 分配的 partition 对其中的消息进行消费。

(5)当消费者消费完该条消息后,消费者会向 broker 发送一个该消息已被消费的反馈,即该消息的 offset 若为手动提交:可以是消费完一条消息就提交一个 offset,也可以是消费完这一批消息后,提交最后一个消息的 offset,关键看代码怎么写。

若为自动提交:提交最后一个消息的 offset。

(6)当 broker 接到消费者的 offset 后,会更新到相应的_consumeroffset 中。

(7)以上过程一直重复,直到消费者停止请求消息。

(8)消费者可以重置 offset,从而可以灵活消费存储在 broker 上的消息。

17. 请介绍一下 Kafka。

  • Kafka是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由LinkedIn公司开发,使用 Scala 语言编写,目前是Apache的开源项目。
  • broker:Kafka服务器,负责消息存储和转发topic:消息类别,Kafka按照topic来分类消息。
  • partition:topic的分区,一个topic可以包含多个partition,topic消息保存在各个partition上。
  • offset:消息在日志中的位置,可以理解是消息在 partition 上的偏移量,也是代表该消息的唯一序号 Producer :消息生产者。
  • Consumer:消息消费者。
  • ConsumerGroup:消费者分组,每个Consumer必须属于一个group。
  • Zookeeper:保存着集群 broker、topic、partition 等meta数据;另外,还负责 broker 故障发现, partitionleader 选举,负载均衡等功能。

18. 什么情况会导致 Kafka 运行变慢?

  • CPU性能瓶颈
  • 磁盘读写瓶颈
  • 网络瓶颈

总结

以上就是今天的内容了