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.

37 lines
3.3 KiB

This file contains ambiguous Unicode characters!

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]]