kafka的一些概念整理
kafka介绍
- kafka作为一个消息存储系统,具有异步,削峰,解耦的作用。与一般的消息队列的先进先出特性不同,kafka只是一个消息缓冲池,全局是无序的(也可以强行变成有序,不过这种情况不在这里讨论)
-
kafka的一些概念
- 消息:Record。Kafka 是消息引擎嘛,这里的消息就是指 Kafka 处理的主要对象。
- 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
- 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
- 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
- 副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
- 生产者:Producer。向主题发布新消息的应用程序。
- 消费者:Consumer。从主题订阅新消息的应用程序。
- 消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
- 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
生产者和消费者生产和消费的单位是Topic,Topic会被分成多个分区存储在broker上(如果指定了分区数的话,默认是一个分区)。
topic和分区和副本的关系
一个topic可以有多个分区(partition),每个分区保存部分topic的数据,所有的partition当中的数据全部合并起来,就是一个topic当中的所有的数据。
每一个分区的多个副本中只能有一个leader和多个follower。kafka只支持增加分区,不支持减少分区
一个broker服务下,可以创建多个分区,broker数与分区数没有关系;
在kafka中,每一个分区会有一个编号:编号从0开始。
但是副本是每台broker上只有一个的,为的是起到数据安全的作用。如下图所示
消费者组和消费者
消费者组由一个或者多个消费者组成,同一个组中的消费者对于同一条消息只消费一次。
每个消费者都属于某个消费者组,如果不指定,那么所有的消费者都属于默认的组。
每个消费者组都有一个ID,即group ID。组内的所有消费者协调在一起来消费一个订阅主题( topic)的所有分区(partition)。当然,每个分区只能由同一个消费组内的一个消费者(consumer)来消费,可以由不同的消费组来消费。
也就是说同一个消费组中只能一个消费者消费一个分区,不允许有重叠。不同消费者组的消费者可以共同消费一个分区。
partition数量决定了每个consumer group中并发消费者的最大数量(即使分配过多消费者,分区被吃完了,剩下的就空等,浪费资源)。具体可以看下面俩张图。
kafka的物理存储
kafka生产者生产的数据是存储在分区中。每个分区会被分成多个segment文件,每个segment文件又分成.log数据文件和.index索引文件
kafka生产的数据是不断追加在末尾的,且是持久化存储(可以设定清除时间)。消费者消费数据也会建立它对应的topic文件,保存上次消费到那条数据以便下次继续消费。
可以在下图看到__consumer_offsets-8 中也是同样的文件结构。
index中存放是k-v对,k是消息offset,也即是第几条消息。(
)v是.log文件中的字节偏移量。是隔一段建立一条索引的,不是每条都去建立。
这样就能通过字节偏移量找到对应的第几条消息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)