Kafka原理总结

构成:

1.producer:

    producer直接发消息到broker,broker会返回一些topic的元数据信息,比如:这些元信息包括哪些机器是存活的,topic的leader partition都在哪,现阶段哪些leader partition是可以直接被访问的

2.consumers

    1).high-level-api:维持了已消费消息的状态,每次消费的都是下一个消息;还支持以组的形式来消费topic;

    2).simple-api:底层api,维持了一个和单一broker的连接,并且这个API是完全无状态的,每次请求需要指定offset值,可以通过设置offset值来重复读取    

                             消费过的数据

3.broker:

    1).partitions:

        topic是以partition的形式存放的,可配置

    2).replications:

        备份机制,实现多个备份,防止单个broker挂了后,数据不会丢失

    3).leaders:

        partition的副本中只有一个会被选举为leader,用来进行读写

核心特性:

    1.压缩:

            kafka支持以集合为单位发送消息,在此基础上,kafka还支持对消息集合进行压缩,producer端可以通过GZIP或SNAPPY格式进行压缩,然后在

            consumer端进行解压,在大数据处理上,性能瓶颈往往体现在网络上而不是CPU.

            如何区别消息是否被压缩,kafka在消息头部添加了一个描述压缩属性的字节,这个字节的后两位表示消息压缩采用的编码,如果后两位是0,说明

            没有被压缩

    2.消息可靠性:

            为了防止消息丢失、多次发送等情况,kafka采用如下处理:

            1).producer端:producer会等待borker成功接收消息的反馈(可通过参数设置来控制等待时间),如果消息丢失或者broker挂了,producer会重新

                                     发送(通过参数控制是否等待所有备份节点都收到消息)

            2).consumer端:consumer收到消息,但是在处理过程中挂了,此时consumer会通过offset值重新找到上一个消息在进行处理.当然,consumer还

                                    有权限控制这个offset值.

    3.备份机制:

            0.8版本新特性,一个备份数量为n的集群允许n-1个节点失败.在所有备份节点中,有一个节点作为lead节点,这个节点保存了其它备份节点列表,并维持各个备份间的状体同步

     4.高效性相关设计:

            4.1).消息的持久化

                    磁盘性能事实:磁盘驱动器的吞吐量跟寻到延迟是相背离的,也就是所,线性写的速度远远大于随机写,举例:在一个6 7200rpm SATA 

                                             RAID-5 的磁盘阵列上线性写的速度大概是600M/秒,但是随机写的速度只有100K/秒,两者相差将近6000倍

                    顺序I/O是为了提高读写硬盘的速度

            4.2).常数时间性能保证

                    一个持久化的队列可以构建在对一个文件的读和追加上,kafka数据持久化就是两个文件,一个保存数据(.log文件),一个保存offset相关信 

                   息(.index文件)

            4.3).更多的效率考虑

                    1).为了减少大量小IO操作,kafka都是以消息块的形式来追加消息到log中的

                    2).为了减小过多的字节拷贝,kafka设计了标准字节消息,producer、consumer、broker共享这一中消息格式

                        Memory Mapped Files:内存映射文件->直接利用操作系统的Page来实现文件到物理内存的映射,省去了用户空间到内核空间的赋值开销

                                                             (调用文件的read会把数据先放到内核空间的内存中,然后再复制到用户空间的内存中)

                                                                注:Java NIO提供了MappedByteBuffer来实现内存映射

性能瓶颈:

    1.网络传输

    2.磁盘吞吐量

你可能感兴趣的:(Kafka原理总结)