一: kafka组成模型
Kafka是一个开源的高吞吐量的分布式发布订阅消息系统,由生产者(producer)、消费者(consumer)、服务端broker三者组成。
二:kafka 集群模型
Producer(生产者):发送消息
Consumer(消费者):订阅消息
Broker:Kafka的节点,服务端
Controller:Kafka服务器的主节点
Follower:Kafka服务的从节点
Topic:主题,类似于数据库里的表
Partition:分区,一个主题可以有多个分区,类似于数据库里的分区
Replica:副本,为了保证数据安全,每个Partition可以设置多个副本(leader replica,Follower replica)
Message:消息,消息存在分区里
Offset:偏移量,消息存储进度/消费者的消费进度
zookeeper : 分布式应用程序协调者,在它里面会创建一个目录来管理kafka各个topic 的 partition的offset 信息(kafka 0.8版本和之前,kafka1.0版本去掉了zookeeper维护分区数据偏移量, 改用 _consumer_offsets 主题来维护各个broker中topic的 offsets )
三:kafka 服务端(broker)设计
kafka是一个把性能用到极致的框架,是一个支持高可用、高性能、高并发的分布式消息系统。
高并发:线程池思想
高性能:磁盘的顺序读写设计
Kafka是将消息记录持久化到本地磁盘中的, 一般人会认为磁盘读写性能差,对Kafka性能如何保证提出质疑。实际上不管是内存还是磁盘,快或慢关键在 于寻址的方式,磁盘分为顺序读写与随机读 写,内存也一样分为顺序读写与随机读写。 基于磁盘的随机读写确实很慢,但磁盘的顺序读写性能却很高,一般而言要高出磁盘随机读写三个数量级,一些情况下磁盘顺序读写性能甚至要高于内存随机读写。
高性能:跳表设计
log文件:里面存储的是消息
index文件:存储索引消息。
这两个文件的文件名相同,成对出现。这个文件名是 以 log 文件里的第一条消息的 offset 命名的,如下第一个文 件的文件名叫 00000000000012768089,代表着这个文件 里的第一个消息的 offset 是 12768089,也就是说第二条消 息就是 12768090 了。
高性能:稀松索引
index文件中稀松的索引设计思想和 跳表设计的核心思想一样,都是走的范围检索。在索引文件中确定索引所在的index 文件的首个起始index值,然后拿着这个index值去log文件里遍历,直到遍历到自己想要的索引对应的数据文件,然后找到posistion 对应的物理磁盘位置。
高性能:零拷贝
非零拷贝
零拷贝
零拷贝技术很明显得减少了2次数据传输。第一次是从操作系统的内存中拷贝数据到 kafka的broker里面;第二次是从kafka的broker里面拷贝数据到socket cache 端。
四:生产端设计
批处理
内存池
封装同一服务请求
在队列里,会把发往同一个分区的多个批次的数据,合并成一个批次,统一发往下游。
五:消费者端设计
P2P模型:也称点对点模型,指同一条消息只能被一个消费者消费,也就是说一个消息如果被这个消费者 消费了,其余的消费者就都不能消费了,传统的消息系统用的就是这种方式。
发布订阅模型:允许消息被多个Consume r消费,但是一个Consume r需要订阅主题的所有分区。
Kafka的Consumer Group设计
同一个消费组是P2P方式,一个消息只能被同一个组的一 消费者消费。
不同组是订阅模式,一个消息可以被不同的消费组 消费。
一个分区同一时间只会被 同组一个消费者消费。
Consumer设计-偏移量存储
kafka 1.0版本的偏移量存储设计
六:总结
可以看出kafka是一款性能设计上很花心思、有很多巧妙设计思想的消息中间件产品。