定位:kafka是一款分布式,高吞吐量,基于发布/订阅的消息中间件。
核心组件:
broker:kafka服务器,负责消息的存储和转发。
topic:主题,消息的类别,kafka按照topic分类消息。
partition:分区,一个topic可以有多个partition分区,topic中的消息保存在各个partition上。
offset:偏移量。消息在kafka消息文件中的位置,可以理解为消息在partition上的偏移量,也是代表该消息的唯一序号。
producer:消息的生产者。
consumer:消息的消费者。
consumer group: 消费组,消费者的分组,每个消费者分组必须要属于一个group
zookeeper:配置中心,保存kafka集群的broker,topic,partition等信息,另外还负责broker的故障发现,partition的leader选举,负载均衡等。
Kafka的存储设计:
partition分区数据文件(offset,messageSize,data)
partition中的每条message包含3个属性,offset表示这个消息在partition中的偏移量,可以看作每个消息的消息顺序id。messageSIze则是消息的大小,data为消息的内容。
数据文件分段segement(顺序读写,分段命令,二分查找)
partition物理上是由多个segement文件组成,每个segement文件大小相同,顺序读写。而且每个segement文件都是以当前文件中offset最小的值命名.log,这样我们查offset消息时,就可以很快二分查找定位到这个offset消息在哪个segement文件中。
数据文件索引(分段索引、稀疏存储)
kafka为每个segement文件建立了索引文件,文件名与segement文件名相同.index。但是kafka并没有给每一条消息都建立索引,而是采取稀疏索引的方式,每隔一定字节的数据建立索引,从而避免索引文件过大,因此可以将索引文件放入内存中。
生产者设计(负载均衡)
由于topic是由多个partition组成,且partition均匀分布在不同的broker上,因此为了有效的利用broker的集群性能,提高吞吐量,producer会通过hash或者随机等方式将消息平均发送到多个partittion上,以实现负载均衡。
批量发送
批量发送也是提高吞吐量的重要方式,Producer端可以在内存中合并多条消息,以一次请求的方式批量发送给不同的Broker,从而大大减少broker存储消息时的io操作,所以也一定程度上影响消息的实时性,但是换取了更好的吞吐量。
消息压缩
producer端可以用GZIP或者Snappy对消息集合压缩。producer端压缩后,consumer也需要解压,压缩解压需要消耗少量cpu资源,但是好处是减少传输的数据量,减轻网络压力,在大数据处理上,往往瓶颈体现在网络上而不是cpu。
消费者设计
consumer group
同一 Consumer Group 中的多个 Consumer 实例,不同时消费同一个 partition,等效于队列模 式。partition内消息是有序的,Consumer通过pull方式消费消息。Kafka不删除已消费的消息
对于partition,顺序读写磁盘数据,以时间复杂度O(1)方式提供消息持久化能力。