# 一、基本概念 ## 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]]