You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# 一、基本概念
## 1.1 生产者和消费者
kafka是典型的生产者消费者模型, 根据消费者的不同分为点对点模式和发布订阅模式
点对点:
![[Pasted image 20231122142855.png]]
发布订阅:
![[Pasted image 20231122142906.png]]
## 1.2 主题(Topic)与分区(Partition)
![[Pasted image 20231122144605.png]]
在 Kafka 中,消息以**主题( Topic) **来分类,每一个主题都对应一个「消息队列」,这有点儿类似于数据库中的表。但是如果我们把所有同类的消息都塞入到一个“中心”队列中,势必缺少可伸缩性,无论是生产者/消费者数目的增加,还是消息数量的增加,都可能耗尽系统的性能或存储。通过现在引入**分区( Partition) **的概念,类似“允许多修几条道”的方式对主题完成了水平扩展。
主题是一个逻辑上的概念,它还可以细分为多个分区,一个分区只属于单个主题,很多时候也会把分区称为主题分区( Topic-Partition )。同一主题下的不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志( Log )文件,消息在被追加到分区日志、文件的时候都会分配一个特定的偏移量( offset )。 offset 是消息在分区中的唯一标识, Kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,也就是说,**Kafka 保证的是分区有序而不是主题有序。**
## 1.3 Broker与集群
一个 Kafka 服务器也称为 Broker, 它接受生产者发送的消息并存入磁盘; Broker 同时服务消费者拉取分区消息的请求,返回目前已经提交的消息。使用特定的机器硬件,一个 Broker 每秒可以处理成千上万的分区和百万量级的消息。
![[Pasted image 20231122145003.png]]
# 二、原理
## 2.1 存储设计
Partition 是topic的物理分组, 每个Partition都是一个有序队列( 队列中的消息都有offset作为偏移量, 可以理解为数组下标) 。Partition又由多个Segment 组成。
在Kafka文件存储中, 同一个topic下有多个不同partition, 每个partition为一个目录, partiton命名规则为topic名称+有序序号, 第一个partiton序号从0开始, 序号最大值为partitions数量减1。
### 2.1.1 partiton中文件存储方式
![[Pasted image 20231122152225.png]]
- 每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等, 这种特性方便old segment file快速被删除。
- 每个partiton只需要支持**顺序读写**就行了, segment文件生命周期由服务端配置参数决定。
这样做的好处就是能快速删除无用文件,有效提高磁盘利用率。
### 2.1.2 partiton中segment文件存储结构
![[Pasted image 20231122152432.png]]
- segment file组成: 由2大部分组成, 分别为index file和data file, 此2个文件一一对应, 成对出现, 后缀".index"和“.log”分别表示为segment索引文件、数据文件。
- segment文件命名规则: partion全局的第一个segment从0开始, 后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小, 19位数字字符长度, 没有数字用0填充。
![[Pasted image 20231122152519.png]]