谈一谈Kafka的那些事

面向面试的博客,以问答式Q/A方式呈现。


Question1:简单介绍一下你对 Kafka 的理解?

Answer1:

Kafka 是一种高吞吐量、高可用、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用Scala 语言编写,目前是 Apache 的开源项目。

附:
高吞吐量:生产者发送数据的时候采用压缩的方式来减少传输的数据量,减轻对网络传输的压力,采用批量发送的方式来减少 broker 存储消息的 IO 操作次数,获得更大的吞吐量。
高可用:同一个Partition的Replica副本尽量分散到不同的机器,保证高可用,不会因为某一个broker故障影响整体。

在这里插入图片描述

图中概念解释:
Partitioned Data Pubilcation:分区数据发布;Ordered Subscription:订购;
TopicA-part0:表示TopicA-partition0,同理,TopicA-part1 表示TopicA-partition1,TopicA-part2 表示 TopicA-partition2,同一个partition只能有一个leader,由zookeeper负责partition中leader的选举。
图中内容解释:
一个Topic可以包含多个partition,如图所示,同时注意,同一个Partition的Replica副本尽量分散到不同的机器,保证高可用,图中TopicA-part0在左边和中间两个broker上,图中TopicA-part1在中间和右边两个broker上,图中TopicA-part2在左边和右边两个broker上,都不会在同一个broker上的,体现Kafka高可用。

  1. broker:Kafka 服务器,负责消息存储和转发。
  2. topic:消息类别,Kafka 按照 topic 来分类消息。
  3. partition:topic 的分区,一个 topic 可以包含多个 partition,topic 消息保存在各个partition 上。
  4. offset:消息在日志中的位置,可以理解是消息在 partition 上的偏移量,也是代表该消息的唯一序号。
  5. Producer:消息生产者。
  6. Consumer:消息消费者。
  7. Consumer Group:消费者分组,每个 Consumer 必须属于一个 group。
  8. Zookeeper:保存着集群 broker、topic、partition 等 meta 数据;另外,还负责 broker 故障发现,partition leader 选举,负载均衡等功能。

Question2:介绍一下 Kafka 数据存储结构?

Answer2:

Kafka 数据存储结构包括 partition数据文件、segment数据文件、数据索引文件,如下:

partition 数据文件( offset,MessageSize,data )

partition中的每条Message包含了以下三个属性:

offset,MessageSize,data。

offset表示 Message 在这个 partition 中的偏移量,offset 不是该 Message 在 partition 数据文件中的实际存储位置,而是逻辑上一个值,它唯一确定了partition中的一条Message,可以认为offset是 partition 中 Message 的 id;
MessageSize 表示消息内容 data 的大小;
data 为 Message 的具体内容。

segment数据文件( 顺序读写、分段命令、二分查找 )

顺序读写:partition 物理上由多个 segment 文件组成,每个 segment 大小相等,顺序读写。

分段命令:每个 segment数据文件以该段中最小的 offset 命名,文件扩展名为.log。

二分查找:这样在查找指定 offset 的 Message 的时候,用二分查找就可以定位到该 Message 在哪个 segment 数据文件中。

索引文件(分段索引、 稀疏存储 )

分段索引:Kafka 为每个分段后的数据文件建立了索引文件,文件名与数据文件的名字是一样的,只是文件扩展名为.index。

稀疏存储:index 文件中并没有为数据文件中的每条 Message 建立索引,而是采用了稀疏存储的方式,每隔一定字节的数据建立一条索引。这样避免了索引文件占用过多的空间,从而可以将索引文件保留在内存中。

索引文件和数据文件对应关系,如下图所示:
在这里插入图片描述

左边.index是索引文件,右边.log是数据文件。


Question3:简要阐述一下 Kafka 生产者设计?

Answer3:

Kafka 生产者设计架构,如下图所示:
在这里插入图片描述
1、负载均衡(partition 会均衡分布到不同 broker 上)

由于消息 topic 由多个 partition 组成,且 partition 会均衡分布到不同 broker 上,因此,为了有效利用 broker 集群的性能,提高消息的吞吐量,producer 可以通过随机或者 hash 等方式,将消息平均发送到多个 partition 上,以实现负载均衡。

2、批量发送

是提高消息吞吐量重要的方式,Producer 端可以在内存中合并多条消息后,以一次请求的方式发送了批量的消息给 broker,从而大大减少 broker 存储消息的 IO 操作次数。但也一定程度上影响了消息的实时性,相当于以时延代价,换取更好的吞吐量。

3、压缩( GZIP 或 Snappy )

Producer 端可以通过 GZIP 或 Snappy 格式对消息集合进行压缩。Producer 端进行压缩之后,在Consumer 端需进行解压。压缩的好处就是减少传输的数据量,减轻对网络传输的压力,在对大数据处理上,瓶颈往往体现在网络上而不是 CPU(压缩和解压会耗掉部分 CPU 资源)。


Question4:简要阐述一下 Kafka 消费者设计?

Answer4:

Kafka 消费者设计架构,如下图所示:
在这里插入图片描述
同一 Consumer Group 中的多个 Consumer 实例,不同时消费同一个 partition,等效于队列模式。partition 内消息是有序的,Consumer 通过 pull 方式消费消息。Kafka 不删除已消费的消息。对于 partition,顺序读写磁盘数据,以时间复杂度 O(1)方式提供消息持久化能力。

发布了207 篇原创文章 · 获赞 80 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_36963950/article/details/105333460