kafka 面试

Kafka是一个分布式流处理平台,以高吞吐、持久化和可扩展性著称。其架构包括ZooKeeper协调、生产者、消费者、消费者组、Topic、Partition和Replication等关键组件。Kafka通过磁盘顺序写、PageCache利用及零拷贝技术实现高性能。选择Kafka是因为其支持多生产者、多消费者、数据持久性和强大的伸缩性。

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

在这里插入图片描述

概述

Kafka 起初是由 Linkedin 公司采用 Scala 语言开发的一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现己被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。

需求:

设计思路

实现思路分析

1.kafka 的架构描述一下?

Kafak 总体架构图中包含多个概念:
(1)ZooKeeper:Zookeeper 负责保存 broker 集群元数据,并对控制器进行选举等操作。
(2)Producer:生产者负责创建消息,将消息发送到 Broker。
(3)Broker: 一个独立的 Kafka 服务器被称作 broker,broker 负责接收来自生产者的消息,为消息设置偏移量,并将消息存储在磁盘。broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。
(4)Consumer:消费者负责从 Broker 订阅并消费消息。
(5)Consumer Group:Consumer Group 为消费者组,一个消费者组可以包含一个或多个 Consumer 。
使用 多分区 + 多消费者 方式可以极大 提高数据下游的处理速度,同一消费者组中的消费者不会重复消费消息,同样的,不同消费组中的消费者消费消息时互不影响。Kafka 就是通过消费者组的方式来实现消息 P2P 模式和广播模式。

(6)Topic:Kafka 中的消息 以 Topic 为单位进行划分,生产者将消息发送到特定的 Topic,而消费者负责订阅 Topic 的消息并进行消费。

(7)Partition:一个 Topic 可以细分为多个分区,每个分区只属于单个主题。同一个主题下不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的 日志(Log)文件,消息在被追加到分区日志文件的时候都会分配一个特定的 偏移量(offset)。

(8)Offset:offset 是消息在分区中的唯一标识,Kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,也就是说,Kafka保证的是分区有序性而不是主题有序性。
(9)Replication:副本,是 Kafka 保证数据高可用的方式,Kafka 同一 Partition 的数据可以在多 Broker 上存在多个副本,通常只有主副本对外提供读写服务,当主副本所在 broker 崩溃或发生网络异常,Kafka 会在 Controller 的管理下会重新选择新的 Leader 副本对外提供读写服务。

(10)Record:实际写入 Kafka 中并可以被读取的消息记录。每个 record 包含了 key、value 和 timestamp。

(11)Leader: 每个分区多个副本的 “主” leader,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。
(12)follower: 每个分区多个副本中的"从" follower,实时从 Leader 中同步数据,保持和 leader 数据的同步。Leader 发生故障时,某个 follow 会成为新的 leader。

2.3、发布订阅的消息系统那么多,为啥选择kafka?

KafKa 可以无缝地支持多个生产者,不管客户端使用一个主题,还是多个主题。Kafka 适合从多个前端系统收集数据,并以统一的格式堆外提供数据。
Kafka 支持多个消费者从一个单独的消息流中读取数据,并且消费者之间互不影响。这与其他队列系统不同,其他队列系统一旦被客户端读取,其他客户端就不能 再读取它。并且多个消费者可以组成一个消费者组,他们共享一个消息流,并保证消费者组对每个给定的消息只消费一次。

(3)基于磁盘的数据存储
Kafka 允许消费者非实时地读取消息,原因在于 Kafka 将消息提交到磁盘上,设置了保留规则进行保存,无需担心消息丢失等问题。
(4)伸缩性

可扩展多台 broker。用户可以先使用单个 broker,到后面可以扩展到多个 broker
(5)高性能
Kafka 可以轻松处理百万千万级消息流,同时还能保证 亚秒级 的消息延迟。

4、kafka 如何做到高吞吐量和性能的?

操作系统本身有一层缓存,叫做 page cache,是在 内存里的缓存,我们也可以称之为 os cache,意思就是操作系统自己管理的缓存。
Kafka 在写入磁盘文件的时候,可以直接写入这个 os cache 里,也就是仅仅写入内存中,接下来由操作系统自己决定什么时候把 os cache 里的数据真的刷入磁盘文件中。通过这一个步骤,就可以将磁盘文件写性能提升很多了,因为其实这里相当于是在写内存,不是在写磁盘,原理图如下:

2、磁盘顺序写

另一个主要功能是 kafka 写数据的时候,是以磁盘顺序写的方式来写的。也就是说,仅仅将数据追加到文件的末尾,不是在文件的随机位置来修改数据.
普通的机械磁盘如果你要是随机写的话,确实性能极差,也就是随便找到文件的某个位置来写数据。
但是如果你是 追加文件末尾 按照顺序的方式来写数据的话,那么这种磁盘顺序写的性能基本上可以跟写内存的性能相差无几。
基于上面两点,kafka 就实现了写入数据的超高性能。

3、零拷贝
大家应该都知道,从 Kafka 里经常要消费数据,那么消费的时候实际上就是要从 kafka 的磁盘文件里读取某条数据然后发送给下游的消费者,如下图所示
那么这里如果频繁的从磁盘读数据然后发给消费者,会增加两次没必要的拷贝,如下图:
一次是从操作系统的 cache 里拷贝到应用进程的缓存里,接着又从应用程序缓存里拷贝回操作系统的 Socket 缓存里。
也就是说,直接让操作系统的 cache 中的数据发送到网卡后传输给下游的消费者,中间跳过了两次拷贝数据的步骤,Socket 缓存中仅仅会拷贝一个描述符过去,不会拷贝数据到 Socket 缓存,如下图所示:

参考资料和推荐阅读

  1. 暂无

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~

### 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' # 消息压缩 ) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值