> For the complete documentation index, see [llms.txt](https://gitbook.wenzhihuai.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gitbook.wenzhihuai.com/mian-shi/kafka.md).

# kafka

1、请说明什么是Apache Kafka? Apache Kafka是由Apache开发的一种发布订阅消息系统，它是一个分布式的、分区的和可复制的提交日志服务。

2、说说Kafka的使用场景？ ①异步处理 ②应用解耦 ③流量削峰 ④日志处理 ⑤消息通讯等。

3、使用Kafka有什么优点和缺点？ 优点： ①支持跨数据中心的消息复制； ②单机吞吐量：十万级，最大的优点，就是吞吐量高; ③topic数量都吞吐量的影响：topic从几十个到几百个的时候，吞吐量会大幅度下降。所以在同等机器下，kafka尽量保证topic数量不要过多。如果要支撑大规模topic，需要增加更多的机器资源; ④时效性：ms级; ⑤可用性：非常高，kafka是分布式的，一个数据多个副本，少数机器宕机，不会丢失数据，不会导致不可用; ⑥消息可靠性：经过参数优化配置，消息可以做到0丢失; ⑦功能支持：功能较为简单，主要支持简单的MQ功能，在大数据领域的实时计算以及日志采集被大规模使用。

缺点： ①由于是批量发送，数据并非真正的实时； 仅支持统一分区内消息有序，无法实现全局消息有序； ②有可能消息重复消费； ③依赖zookeeper进行元数据管理，等等。

4、为什么说Kafka性能很好，体现在哪里？ ①顺序读写 ②零拷贝 ③分区 ④批量发送 ⑤数据压缩

5、请说明什么是传统的消息传递方法? 传统的消息传递方法包括两种： 排队：在队列中，一组用户可以从服务器中读取消息，每条消息都发送给其中一个人。 发布-订阅：在这个模型中，消息被广播给所有的用户。

6、请说明Kafka相对传统技术有什么优势? ①快速:单一的Kafka代理可以处理成千上万的客户端，每秒处理数兆字节的读写操作。 ②可伸缩:在一组机器上对数据进行分区 ③和简化，以支持更大的数据 ④持久:消息是持久性的，并在集群中进 ⑤行复制，以防止数据丢失。 ⑥设计:它提供了容错保证和持久性

7、解释Kafka的Zookeeper是什么?我们可以在没有Zookeeper的情况下使用Kafka吗? Zookeeper是一个开放源码的、高性能的协调服务，它用于Kafka的分布式应用。 不，不可能越过Zookeeper，直接联系Kafka broker。一旦Zookeeper停止工作，它就不能服务客户端请求。 Zookeeper主要用于在集群中不同节点之间进行通信 在Kafka中，它被用于提交偏移量，因此如果节点在任何情况下都失败了，它都可以从之前提交的偏移量中获取 除此之外，它还执行其他活动，如: leader检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。

8、解释Kafka的用户如何消费信息? 在Kafka中传递消息是通过使用sendfile API完成的。它支持将字节从套接口转移到磁盘，通过内核空间保存副本，并在内核用户之间调用内核。

9、解释如何提高远程用户的吞吐量? 如果用户位于与broker不同的数据中心，则可能需要调优套接口缓冲区大小，以对长网络延迟进行摊销。

10、解释一下，在数据制作过程中，你如何能从Kafka得到准确的信息? 在数据中，为了精确地获得Kafka的消息，你必须遵循两件事: 在数据消耗期间避免重复，在数据生产过程中避免重复。 这里有两种方法，可以在数据生成时准确地获得一个语义: 每个分区使用一个单独的写入器，每当你发现一个网络错误，检查该分区中的最后一条消息，以查看您的最后一次写入是否成功 在消息中包含一个主键(UUID或其他)，并在用户中进行反复制

11、解释如何减少ISR中的扰动?broker什么时候离开ISR? ISR是一组与leaders完全同步的消息副本，也就是说ISR中包含了所有提交的消息。ISR应该总是包含所有的副本，直到出现真正的故障。如果一个副本从leader中脱离出来，将会从ISR中删除。

12、Kafka为什么需要复制? Kafka的信息复制确保了任何已发布的消息不会丢失，并且可以在机器错误、程序错误或更常见些的软件升级中使用。

13、如果副本在ISR中停留了很长时间表明什么? 如果一个副本在ISR中保留了很长一段时间，那么它就表明，跟踪器无法像在leader收集数据那样快速地获取数据。

14、请说明如果首选的副本不在ISR中会发生什么? 如果首选的副本不在ISR中，控制器将无法将leadership转移到首选的副本。

15、有可能在生产后发生消息偏移吗? 在大多数队列系统中，作为生产者的类无法做到这一点，它的作用是触发并忘记消息。broker将完成剩下的工作，比如使用id进行适当的元数据处理、偏移量等。

作为消息的用户，你可以从Kafka broker中获得补偿。如果你注视SimpleConsumer类，你会注意到它会获取包括偏移量作为列表的MultiFetchResponse对象。此外，当你对Kafka消息进行迭代时，你会拥有包括偏移量和消息发送的MessageAndOffset对象。

16、Kafka的设计时什么样的呢？ Kafka将消息以topic为单位进行归纳 将向Kafka topic发布消息的程序成为producers. 将预订topics并消费消息的程序成为consumer. Kafka以集群的方式运行，可以由一个或多个服务组成，每个服务叫做一个broker. producers通过网络将消息发送到Kafka集群，集群向消费者提供消息

17、数据传输的事物定义有哪三种？ （1）最多一次: 消息不会被重复发送，最多被传输一次，但也有可能一次不传输 （2）最少一次: 消息不会被漏发送，最少被传输一次，但也有可能被重复传输. （3）精确的一次（Exactly once）: 不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输一次，这是大家所期望的

18、Kafka判断一个节点是否还活着有那两个条件？ （1）节点必须可以维护和ZooKeeper的连接，Zookeeper通过心跳机制检查每个节点的连接 （2）如果节点是个follower,他必须能及时的同步leader的写操作，延时不能太久

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

20、Kafa consumer是否可以消费指定分区消息？ Kafa consumer消费消息时，向broker发出"fetch"请求去消费特定分区的消息，consumer指定消息在日志中的偏移量（offset），就可以消费从这个位置开始的消息，customer拥有了offset的控制权，可以向后回滚去重新消费之前的消息，这是很有意义的

21、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阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发

22、Kafka存储在硬盘上的消息格式是什么？ 消息由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和CRC32校验码。 消息长度: 4 bytes (value: 1+4+n) 版本号: 1 byte CRC校验码: 4 bytes 具体的消息: n bytes

23、Kafka高效文件存储设计特点： (1).Kafka把topic中一个parition大文件分成多个小文件段，通过多个小文件段，就容易定期清除或删除已经消费完文件，减少磁盘占用。 (2).通过索引信息可以快速定位message和确定response的最大大小。 (3).通过index元数据全部映射到memory，可以避免segment file的IO磁盘操作。 (4).通过索引文件稀疏存储，可以大幅降低index文件元数据占用空间大小。

24、Kafka 与传统消息系统之间有三个关键区别 (1).Kafka 持久化日志，这些日志可以被重复读取和无限期保留 (2).Kafka 是一个分布式系统：它以集群的方式运行，可以灵活伸缩，在内部通过复制数据提升容错能力和高可用性 (3).Kafka 支持实时的流式处理

25、Kafka创建Topic时如何将分区放置到不同的Broker中 副本因子不能大于 Broker 的个数； 第一个分区（编号为0）的第一个副本放置位置是随机从 brokerList 选择的； 其他分区的第一个副本放置位置相对于第0个分区依次往后移。也就是如果我们有5个 Broker，5个分区，假设第一个分区放在第四个 Broker 上，那么第二个分区将会放在第五个 Broker 上；第三个分区将会放在第一个 Broker 上；第四个分区将会放在第二个 Broker 上，依次类推； 剩余的副本相对于第一个副本放置位置其实是由 nextReplicaShift 决定的，而这个数也是随机产生的

26、Kafka新建的分区会在哪个目录下创建 在启动 Kafka 集群之前，我们需要配置好 log.dirs 参数，其值是 Kafka 数据的存放目录，这个参数可以配置多个目录，目录之间使用逗号分隔，通常这些目录是分布在不同的磁盘上用于提高读写性能。 当然我们也可以配置 log.dir 参数，含义一样。只需要设置其中一个即可。 如果 log.dirs 参数只配置了一个目录，那么分配到各个 Broker 上的分区肯定只能在这个目录下创建文件夹用于存放数据。 但是如果 log.dirs 参数配置了多个目录，那么 Kafka 会在哪个文件夹中创建分区目录呢？答案是：Kafka 会在含有分区目录最少的文件夹中创建新的分区目录，分区目录名为 Topic名+分区ID。注意，是分区文件夹总数最少的目录，而不是磁盘使用量最少的目录！也就是说，如果你给 log.dirs 参数新增了一个新的磁盘，新的分区目录肯定是先在这个新的磁盘上创建直到这个新的磁盘目录拥有的分区目录不是最少为止。

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

28、kafka的ack机制 request.required.acks有三个值 0 1 -1 0:生产者不会等待broker的ack，这个延迟最低但是存储的保证最弱当server挂掉的时候就会丢数据 1：服务端会等待ack值 leader副本确认接收到消息后发送ack但是如果leader挂掉后他不确保是否复制完成新leader也会导致数据丢失 -1：同样在1的基础上 服务端会等所有的follower的副本受到数据后才会受到leader发出的ack，这样数据不会丢失

29、Kafka的消费者如何消费数据 消费者每次消费数据的时候，消费者都会记录消费的物理偏移量（offset）的位置 等到下次消费时，他会接着上次位置继续消费。同时也可以按照指定的offset进行重新消费。

30、消费者负载均衡策略 结合consumer的加入和退出进行再平衡策略。

31、kafka消息数据是否有序？ 消费者组里某具体分区是有序的，所以要保证有序只能建一个分区，但是实际这样会存在性能问题，具体业务具体分析后确认。

32、kafaka生产数据时数据的分组策略,生产者决定数据产生到集群的哪个partition中 每一条消息都是以（key，value）格式 Key是由生产者发送数据传入 所以生产者（key）决定了数据产生到集群的哪个partition

33、kafka consumer 什么情况会触发再平衡reblance? ①一旦消费者加入或退出消费组，导致消费组成员列表发生变化，消费组中的所有消费者都要执行再平衡。 ②订阅主题分区发生变化，所有消费者也都要再平衡。

34、描述下kafka consumer 再平衡步骤? ①关闭数据拉取线程，情空队列和消息流，提交偏移量； ②释放分区所有权，删除zk中分区和消费者的所有者关系； ③将所有分区重新分配给每个消费者，每个消费者都会分到不同分区； ④将分区对应的消费者所有关系写入ZK，记录分区的所有权信息； ⑤重启消费者拉取线程管理器，管理每个分区的拉取线程。

35、Kafka中的ISR、AR又代表什么？ISR的伸缩又指什么 36、Kafka中的HW、LEO、LSO、LW等分别代表什么？ 37、Kafka中是怎么体现消息顺序性的？ 38、Kafka中的分区器、序列化器、拦截器是否了解？它们之间的处理顺序是什么？ 39、Kafka生产者客户端的整体结构是什么样子的？ 40、Kafka生产者客户端中使用了几个线程来处理？分别是什么？ 41、Kafka的旧版Scala的消费者客户端的设计有什么缺陷？ 42、“消费组中的消费者个数如果超过topic的分区，那么就会有消费者消费不到数据”这句话是否正确？如果不正确，那么有没有什么hack的手段？ 43、消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1? 44、有哪些情形会造成重复消费？ 45、那些情景下会造成消息漏消费？ 46、KafkaConsumer是非线程安全的，那么怎么样实现多线程消费？ 47、简述消费者与消费组之间的关系 48、当你使用kafka-topics.sh创建（删除）了一个topic之后，Kafka背后会执行什么逻辑？ 49、topic的分区数可不可以增加？如果可以怎么增加？如果不可以，那又是为什么？ 50、topic的分区数可不可以减少？如果可以怎么减少？如果不可以，那又是为什么？ 51、创建topic时如何选择合适的分区数？ 52、Kafka目前有那些内部topic，它们都有什么特征？各自的作用又是什么？ 53、优先副本是什么？它有什么特殊的作用？ 54、Kafka有哪几处地方有分区分配的概念？简述大致的过程及原理 55、简述Kafka的日志目录结构 56、Kafka中有那些索引文件？ 57、如果我指定了一个offset，Kafka怎么查找到对应的消息？ 58、如果我指定了一个timestamp，Kafka怎么查找到对应的消息？ 59、聊一聊你对Kafka的Log Retention的理解 60、聊一聊你对Kafka的Log Compaction的理解 61、聊一聊你对Kafka底层存储的理解（页缓存、内核层、块层、设备层） 62、聊一聊Kafka的延时操作的原理 63、聊一聊Kafka控制器的作用 64、消费再均衡的原理是什么？（提示：消费者协调器和消费组协调器） 65、Kafka中的幂等是怎么实现的 66、Kafka中的事务是怎么实现的（这题我去面试6家被问4次，照着答案念也要念十几分钟，面试官简直凑不要脸。实在记不住的话...只要简历上不写精通Kafka一般不会问到，我简历上写的是“熟悉Kafka，了解RabbitMQ....”） 67、Kafka中有那些地方需要选举？这些地方的选举策略又有哪些？ 68、失效副本是指什么？有那些应对措施？ 69、多副本下，各个副本中的HW和LEO的演变过程 70、为什么Kafka不支持读写分离？ 71、Kafka在可靠性方面做了哪些改进？（HW, LeaderEpoch） 72、Kafka中怎么实现死信队列和重试队列？ 73、Kafka中的延迟队列怎么实现（这题被问的比事务那题还要多！！！听说你会Kafka，那你说说延迟队列怎么实现？） 74、Kafka中怎么做消息审计？ 75、Kafka中怎么做消息轨迹？ 76、Kafka中有那些配置参数比较有意思？聊一聊你的看法 77、Kafka中有那些命名比较有意思？聊一聊你的看法 78、Kafka有哪些指标需要着重关注？ 79、怎么计算Lag？(注意read\_uncommitted和read\_committed状态下的不同) 80、Kafka的那些设计让它有如此高的性能？ 81、Kafka有什么优缺点？ 82、还用过什么同质类的其它产品，与Kafka相比有什么优缺点？ 83、为什么选择Kafka? 84、在使用Kafka的过程中遇到过什么困难？怎么解决的？ 85、怎么样才能确保Kafka极大程度上的可靠性？ 86、聊一聊你对Kafka生态的理解
