文章内容转自: 华仔聊技术(Kafka 面试连环炮)
目录
一.初级
1.Kafka核心组件图
2.在 Kafka 中 Zookeeper 作用是什么?
Kafka 集群能够正常工作,目前还是需要依赖于 ZooKeeper,主要用来「负责 Kafka集群元数据 管理,集群协调工作」,在每个 Kafka 服务器启动的时候去连接并将自己注册到 Zookeeper,类 似注册中心。
Kafka 使用 Zookeeper 存放「集群元数据」、「集群成员管理」、 「Controller 选举」、「其他 管理类任务」等。待 KRaft 提案完成后,Kafka 将完全不依赖 Zookeeper。
3.生产者有哪些发消息的模式?
发后即忘模式「fire-and-forget」,它只管发送消息,并不需要关心消息是否发送成功。本质上也是异步发送的方式, 吞吐量高但会导致消息丢失;
同步发送模式 「sync」,调用 send() 方法会返回一个 Future 对象,再通过调用 Future 对象的 get() 方法,等待结果返回,根据返回的结果可以判断消息是否发送成功, 由于是同步发送会阻塞,只有当消息通过 get() 返回数据时,才会继续下一条消息的发送。
异步发送模式「async」,在调用 send() 方法的时候指定一个 callback 函数,当 Broker 接收到返回的时候,该 callback 函数会被触发执行,通过回调函数能够对异常情况进行处理,当调用了回 调函数时,只有回调函数执行完毕生产者才会结束,否则一直会阻塞。
max_in_flight_requests_per_connection 限制客户端在单个连接上能够发送的未响应请求的个数
4.Kafka 如何合理设置分区数,越多越好吗?
Kafka 如何合理设置分区数
分区设置越多越好吗?
Kafka 高吞吐量的原因之一就是通过 Partition 将 Topic 中的消息均衡保存到 Kafka 集群中 不同的 Broker 中。
理论上说,如果一个 Topic 分区越多,整个集群所能达到的吞吐量就越大。
消耗文件句柄方面分析
端到端的延迟方面分析
高可用性方面分析
5.如何保证 Kafka 中的消息是有序的?
我们知道在 Kafka 中,并不保证消息全局有序,但是可以保证分区有序性,分区与分区之间是无 序的。那么如何保证 Kafka 中的消息是有序的呢? 可以从以下三个方面来入手分析:
生产端 Producer
要严格保证 Kafka 发消息有序,首先要考虑用同步的方式来发送消息, 两种同步发送的方式 如下:
服务端 Broker
消费端 Consumer
在 Consumer 端,根据 Kafka 的模型,一个 Topic 下的每个分区只能从属于这个 Topic 的消费者 组中的某一个消费者。
当消息被发送分配到同一个 Partition 中,消费者从 Partition 中取出来数据的时候,也一定是有顺 序的,没有错乱。
但是消费者可能会有多个线程来并发来消费消息。如果单线程消费数据,吞吐量太低了,而多个线 程并发消费的话,顺序可能就乱掉了。
此时可以通过写多个内存队列,将相同 key 的消息都写入同一个队列,然后对于多个线程,每个 线程分别消息一个队列即可保证消息顺序。
6.Kafka 副本有哪两种,作用是什么?
为为实现「数据备份」的功能 Kafka 提供了副本机制,一个 Topic 的 每个 Partition 都有若干个副本,一个 Leader 副本和若干个 Follower 副本 .
7.Kafka 读写数据这么快是如何做到的?
顺序追加写
kafka 在写数据的时是以「磁盘顺序写」的方式来进行落盘的, 即将数据追加到文件的末尾。对于 普通机械磁盘, 如果是随机写的话, 涉及到磁盘寻址的问题, 导致性能极低, 但是如果只是按照顺序 的方式追加文件末尾的话, 这种磁盘顺序写的性能基本可以跟写内存的性能差不多的。
Page Cache
首先 Kafka 为了保证磁盘写入性能,通过 mmap 内存映射的方式利用操