kafka架构图
-
broker 一台机器节点
- 一台broker中有多个topic
-
topic 消息主题
- 一个topic包含多个partition
-
partition 分区/队列
- 以文件形式存储在机器上
- 一个partition由多个segement文件组成,以最小的offset+.log命名
- 一个分区只有一个leader和多个follower
- 一个分区包含很多message
消息以顺序的方式写入
消息以二分查找的方式检索定位到具体在哪个segment
针对消息文件有相应的索引文件检索过程
查找某个offset的消息,先二分法找出消息所在的segment文件(因为每个segment的命名都是以该文件中消息offset最小的值命名);然后,加载对应的.index索引文件到内存,同样二分法找出小于等于给定offset的最大的那个offset记录(相对offset,position);最后,根据position到.log文件中,顺序查找出offset等于给定offset值的消息。
由于消息在partition的segment数据文件中是顺序读写的,且消息消费后不会删除(删除策略是针对过期的segment文件),这种顺序磁盘IO存储设计是Kafka高性能很重要的原因。
- message 消息
- offset 消息的逻辑便宜值,并不是在文件中的位置
- messageSize 消息大小
- data 消息数据
- producer 生产者
- 一个生产者可以发送消息到多个topic
- 一个生产者同时也可以是消费者
消息发送
负载均衡:由于消息topic由多个partition组成,且partition会均衡分布到不同broker上,因此,为了有效利用broker集群的性能,提高消息的吞吐量,producer可以通过随机或者hash等方式,将消息平均发送到多个partition上,以实现负载均衡。 批量发送:是提高消息吞吐量重要的方式,Producer端可以在内存中合并多条消息后,以一次请求的方式发送了批量的消息给broker,从而大大减少broker存储消息的IO操作次数。但也一定程度上影响了消息的实时性,相当于以时延代价,换取更好的吞吐量。 - consumer 消费者
- 一个消费者可以监听消费多个topic
- 一个消费者同时也可以是生产者
- 任何Consumer必须属于一个Consumer Group
- 同一Consumer Group中的多个Consumer实例,不同时消费同一个partition,等效于队列模式。
- 不同Consumer Group的Consumer实例可以同时消费同一个partition,等效于发布订阅模式。
- partition内消息是有序的,Consumer通过pull方式消费消息。
- Kafka不删除已消费的消息
- consumerGroup 消费者组
- 每个消费组维护自己的消费进度 offset,相互隔离
- 消费进度保存在broker中
队列模式
- 在Consumer Group稳定状态下,每一个Consumer实例只会消费某一个或多个特定partition的数据,而某个partition的数据只会被某一个特定的Consumer实例所消费,也就是说Kafka对消息的分配是以partition为单位分配的,而非以每一条消息作为分配单元;
- 同一Consumer Group中,如果Consumer实例数量少于partition数量,则至少有一个Consumer会消费多个partition的数据;如果Consumer的数量与partition数量相同,则正好一个Consumer消费一个partition的数据;而如果Consumer的数量多于partition的数量时,会有部分Consumer无法消费该Topic下任何一条消息;
- 设计的优势是:每个Consumer不用都跟大量的broker通信,减少通信开销,同时也降低了分配难度,实现也更简单;可以保证每个partition里的数据可以被Consumer有序消费。
- 设计的劣势是:无法保证同一个Consumer Group里的Consumer均匀消费数据,且在Consumer实例多于partition个数时导致有些Consumer会饿死。
发布订阅模式
- 发布订阅模式,又指广播模式,Kafka保证topic的每条消息会被所有Consumer Group消费到,而对于同一个Consumer Group,还是保证只有一个Consumer实例消费到这条消息。
三高保证
- 高性能
过多的生产者及消费者争抢 topic
- 业务分类 topic
- 队列消息分区 partition
总结:
partition的顺序写Producer批量向broker批量写数据 Consumer批量从broker批量拉数据 零copy数盘,调用的sendfile - 高可用
- partition 分leader/follower
- 同步复制机制
- 异步复制
- 同步刷盘
- 异步刷盘
总结就是2点:
备份 + 复制的方式
刷盘方式 - 高扩展
单个机器 topic和partition过多,cup、mem等资源瓶颈
- partition 分散在不同机器
持久化和过期策略
- 消息刷写到磁盘
- retention policy 磁盘大小|超过一定时间 进行
清理segment文件
应用场景
- 流量削峰填谷
- 服务解耦
- 日志