Kafka面试

Kafka技术深度解析:从基础到高级概念与实战策略

文章内容转自: 华仔聊技术(Kafka 面试连环炮)

目录

一.初级

1.Kafka核心组件图

2.在 Kafka 中 Zookeeper 作用是什么?

3.生产者有哪些发消息的模式?

4.Kafka 如何合理设置分区数,越多越好吗?

Kafka 如何合理设置分区数 

分区设置越多越好吗?

5.如何保证 Kafka 中的消息是有序的? 

6.Kafka 副本有哪两种,作用是什么?

7.Kafka 读写数据这么快是如何做到的? 

顺序追加写 

Page Cache

零拷贝技术

8.Kafka中Offset的作用是什么,如何进行维护?

位移 Offset 管理方式 

__consumer_offsets 创建

二.中级

9.谈谈你对 kafka 的集群架构是如何理解的?

Kafka 整体架构图

Kafka存储机制

Kafka 副本机制 

Kafka 网络模型

谈谈你对 Kafka 消息语义是如何理解的? 

Producer端

Consumer端

谈谈你对 Kafka 副本机制是如何理解的? 

副本同步机制 

副本管理  

ISR 副本集合 

谈谈你对Kafka Leader选举机制是如何理解? 

谈谈你对Kafka控制器及选举机制是如何理解?

控制器机制

控制器数据分布 

控制器故障转移 

控制器触发选举场景

控制器选举机制 

谈谈 kafka 的数据可靠性是怎么保证的?

谈谈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 内存映射的方式利用操作系统的 Page Cache 异 步写入 。也可以称为 os cache,意思就是操作系统自己管理的缓存。那么在写磁盘文件的时候, 就可以先直接写入 os cache 中,接下来由操作系统自己决定什么时候把 os cache 里的数据真正 刷入到磁盘中, 这样大大提高写入效率和性能。

### Kafka 面试常见问题及答案 #### 1. Kafka 是什么? Kafka 是一个分布式流处理平台,最初由 LinkedIn 公司开发,并成为 Apache 基金会的开源项目。它主要用于构建实时数据管道和流应用,支持高吞吐量、持久化的消息队列[^1]。 #### 2. Kafka 的主要组件有哪些? Kafka 的主要组件包括 Producer(生产者)、Consumer(消费者)和 Broker(代理)。Producer 负责将数据写入 Kafka 主题,Consumer 负责从主题中读取数据,而 Broker 是 Kafka 集群中的服务器节点,负责存储和管理消息。 #### 3. Kafka 中的 Leader/Follower 模型是如何工作的? 在 Kafka 中,Leader/Follower 模型用于副本管理。虽然 Follower 副本可以对外提供读服务,但为了防止数据不一致的问题,Kafka 默认只允许 Leader 提供服务。这种设计确保了数据的一致性和可靠性[^2]。 #### 4. 如何保证 Kafka 数据消费的顺序? 要保证 Kafka 数据消费的顺序,需要确保同一分区内的消息被单个 Consumer 处理。Kafka 通过分区机制实现消息的有序性,因此可以通过设置每个 Consumer 只消费一个分区来保证顺序[^3]。 #### 5. 如何避免 Kafka 中的消息丢失? 避免 Kafka 消息丢失的关键在于合理配置生产者的 `acks` 参数、Kafka 集群的副本机制,以及正确处理消费者端的偏移量提交。例如,将 `acks` 设置为 `all`,确保所有副本都接收到消息后再确认;同时启用日志清理策略和最小 ISR(In-Sync Replicas)限制,以提高数据可靠性[^3]。 #### 6. Kafka 的消费模式有哪些? Kafka 支持两种消费模式:At-Least-Once 和 At-Most-Once。At-Least-Once 保证每条消息至少被消费一次,可能会有重复消息;At-Most-Once 则可能丢失某些消息,但不会重复消费。此外,Kafka 还支持 Exactly-Once 语义,通过事务机制实现每条消息仅被消费一次[^4]。 #### 7. Kafka 的分区策略是什么? Kafka 的分区策略决定了消息如何分配到不同的分区。默认情况下,Kafka 使用轮询(Round-Robin)策略将消息均匀分布到各个分区。如果指定了分区键,则根据键的哈希值计算分区号,确保相同键的消息总是进入同一个分区。 #### 8. Kafka 的性能优化方法有哪些? - **调整批处理大小**:增大生产者的批量大小可以减少网络开销。 - **压缩消息**:使用 gzip 或 Snappy 等压缩算法减小消息体积。 - **增加分区数**:适当增加分区数量以提升并行度。 - **优化消费者拉取**:调整 `fetch.min.bytes` 和 `fetch.max.wait.ms` 参数,确保消费者高效获取数据[^4]。 ```python # 示例代码:Kafka 生产者配置 from kafka import KafkaProducer producer = KafkaProducer( bootstrap_servers='localhost:9092', acks='all', # 确保所有副本都接收到消息 retries=5, # 重试次数 batch_size=16384, # 批处理大小 compression_type='gzip' # 消息压缩 ) ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值