kafka源码1:基本概念和核心架构

一: 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是一款性能设计上很花心思、有很多巧妙设计思想的消息中间件产品。

 

           

 

posted @ 2022-05-23 18:11  太与旅  阅读(28)  评论(0编辑  收藏  举报