充满寒气的互联网如何在面试中脱颖而出,平时积累很重要,八股文更不能少!下面带来的这篇 Kafka 问答希望能够在你的 offer 上增添一把🔥。
Kafka最初是由Linkedin公司开发的,是一个分布式的、可扩展的、容错的、支持分区的(Partition)、多副本的(replica)、基于Zookeeper框架的发布-订阅消息系统,Kafka适合离线和在线消息消费。它是分布式应用系统中的重要组件之一,也被广泛应用于大数据处理。Kafka是用Scala语言开发,它的Java版本称为Jafka。Linkedin于2010年将该系统贡献给了Apache基金会并成为顶级开源项目之一。
Kafka 是个大家伙,本篇将通过40道问答作为路线,由浅入深,最大程度上覆盖整个 Kafka 的问答内容(预习+复习一步到位)
1、Kafka 的设计
Kafka 将消息以 topic 为单位进行归纳,发布消息的程序称为 Producer,消费消息的程序称为 Consumer。它是以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个 Broker,Producer 通过网络将消息发送到 kafka 集群,集群向消费者提供消息,broker 在中间起到一个代理保存消息的中转站。
Kafka 中重要的组件
1)Producer: 消息生产者,发布消息到Kafka集群的终端或服务
2)Broker:一个 Kafka 节点就是一个 Broker,多个Broker可组成一个Kafka 集群。
如果某个 Topic 下有 n 个Partition 且集群有 n 个Broker,那么每个 Broker会存储该 Topic 下的一个 Partition
如果某个 Topic 下有 n 个Partition 且集群中有 m+n 个Broker,那么只有 n 个Broker会存储该Topic下的一个 Partition
如果某个 Topic 下有 n 个Partition 且集群中的Broker数量小于 n,那么一个 Broker 会存储该 Topic 下的一个或多个 Partition,这种情况尽量避免,会导致集群数据不均衡
3)Topic:消息主题,每条发布到Kafka集群的消息都会归集于此,Kafka是面向Topic 的
4)Partition:Partition 是Topic在物理上的分区,一个Topic可以分为多个Partition,每个Partition是一个有序的不可变的记录序列。单一主题中的分区有序,但无法保证主题中所有分区的消息有序。
5)Consumer:从Kafka集群中消费消息的终端或服务
6)Consumer Group:每个Consumer都属于一个Consumer Group,每条消息只能被Consumer Group中的一个Consumer消费,但可以被多个Consumer Group消费。
7)Replica:Partition 的副本,用来保障Partition的高可用性。
8)Controller: Kafka 集群中的其中一个服务器,用来进行Leader election以及各种 Failover 操作。
9)Zookeeper:Kafka 通过Zookeeper来存储集群中的 meta 消息
2、Kafka 性能高原因
- 利用了 PageCache 缓存
- 磁盘顺序写
- 零拷贝技术
- pull 拉模式
3、Kafka 文件高效存储设计原理
- Kafka把Topic中一个Partition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完成的文件,减少磁盘占用
- 通过索引信息可以快速定位Message和确定response的最大大小
- 通过将索引元数据全部映射到 memory,可以避免 Segment 文件的磁盘I/O操作
- 通过索引文件稀疏存储,可以大幅降低索引文件元数据占用空间大小
4、Kafka 的优缺点
优点
- 高性能、高吞吐量、低延迟:Kafka 生产和消费消息的速度都达到每秒10万级
- 高可用:所有消息持久化存储到磁盘,并支持数据备份防止数据丢失
- 高并发:支持数千个客户端同时读写
- 容错性:允许集群中节点失败(若副本数量为n,则允许 n-1 个节点失败)
- 高扩展性:Kafka 集群支持热伸缩,无须停机
缺点
- 没有完整的监控工具集
- 不支持通配符主题选择
5、Kafka 的应用场景
- 日志聚合:可收集各种服务的日志写入kafka的消息队列进行存储
- 消息系统:广泛用于消息中间件
- 系统解耦:在重要操作完成后,发送消息,由别的服务系统来完成其他操作
- 流量削峰:一般用于秒杀或抢购活动中,来缓冲网站短时间内高流量带来的压力
- 异步处理:通过异步处理机制,可以把一个消息放入队列中,但不立即处理它,在需要的时候在进行处理
6、Kafka 中分区的概念
主题是一个逻辑上的概念,还可以细分为多个分区,一个分区只属于单个主题,很多时候也会把分区称为主题分区(Topic-Partition)。同一主题下的不同分区包含的消息是不同的,分区在存储层面可以看做一个可追加的日志文件
,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。offset 是消息在分区中的唯一标识,kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,也就是说,kafka保证的是分区有序而不是主题有序。
在分区中又引入了多副本(replica)的概念,通过增加副本数量可以提高容灾能力。同一分区的不同副本中保存的是相同的消息。副本之间是一主多从的关系,其中主副本负责读写,从副本只负责消息同步。副本处于不同的 broker 中&#