一文彻底搞懂Kafka

1. Kafka 概念

Kafka 是一种高吞吐量、分布式、基于发布/订阅的消息系统,最初由 LinkedIn 公司开发,使用 Scala 语言编写,目前是 Apache 的开源项目。它的核心概念包括:

  • Broker:Kafka 服务器,负责消息的存储和转发。Kafka 集群由多个 Broker 组成,每个 Broker 可能承载一个或多个分区。

  • Topic:消息类别,Kafka 按照 Topic 来分类消息。Producers 发布消息到指定的 Topic,Consumers 订阅感兴趣的 Topic,并消费其中的消息。

  • Partition:Topic 的分区,一个 Topic 可以包含多个 Partition,消息在各个 Partition 上进行分布存储。每个 Partition 在物理上对应一个独立的日志文件,消息被追加到日志文件的末尾。

  • Offset:消息在日志中的位置,可以理解为消息在 Partition 上的偏移量,也是代表该消息的唯一序号。Consumers 可以通过指定 Offset 来读取指定位置的消息。

  • Producer:消息生产者,负责向 Kafka Broker 发布消息到指定的 Topic。

  • Consumer:消息消费者,负责从 Kafka Broker 订阅 Topic,并消费其中的消息。

  • Consumer Group:消费者分组,每个 Consumer 必须属于一个 Consumer Group。在同一个 Consumer Group 内,每个 Consumer 负责消费 Topic 中一部分 Partition 的消息,以实现消息的负载均衡和并行处理。

  • Zookeeper:保存着 Kafka 集群的元数据信息,包括 Broker、Topic、Partition 等的信息。此外,Zookeeper 还负责协调 Kafka 集群中的 Broker、进行 Leader 选举、进行分区的 Rebalance 等功能。

在这里插入图片描述

2. 数据存储设计

2.1 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 的具体内容

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

partition 物理上由多个 segment 文件组成,每个 segment 大小相等,顺序读写。每个 segment数据文件以该段中最小的 offset 命名,文件扩展名为.log。这样在查找指定 offset 的 Message 的时候,用二分查找就可以定位到该 Message 在哪个 segment 数据文件中。

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

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

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

在这里插入图片描述

3. 生产者设计

3.1 负载均衡(partition 会均衡分布到不同 broker 上)

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

3.2 批量发送

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

4. 消费者设计

在这里插入图片描述

4.1 Consumer Group

同一 Consumer Group 中的多个 Consumer 实例,不同时消费同一个 partition,等效于队列模式。partition 内消息是有序的,Consumer 通过 pull 方式消费消息。Kafka 不删除已消费的消息对于 partition,顺序读写磁盘数据,以时间复杂度 O(1)方式提供消息持久化能力。

  • 39
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值