Kafka随笔(一)之为什么速度那么快

kafka的性能

kafka的底层具体做了哪些设计来提升数据处理的性能的呢,知道这些不仅对于平常开发时对kafka的调优有帮助,同时还能为我们设计后台架构提供一些思路。

一,数据分治

跟多数分布式系统架构设计类似,将数据分散到多个分区中去处理,每个分区再配置一些冗余的数据副本来保证数据安全性。这里与pulsar的数据分治来进行对比。
pulsar虽然也有数据分区的设计,但是该设计对业务来说是无感的,即业务不知道一个topic被分了几个区、也不知道具体某一条消息被分发到了哪一个分区。也就是说虽然pulsar也做了数据分区,但是整个topic还是维持着一个公共的偏移量,当数据被消费时,pulsar会自己去找对应的偏移量的数据在哪个分区然后分发给消费者。当然根据这些特点也能猜到它的三个特点:
1,从微观层面来说,在某一时刻,只有单个一个分区的数据在被消费。
2,对于一个topic来说,生产和消费都是整体有序的。
3,线上实时扩容分区或缩容分区比较容易,对业务无感知。
kafka的消费者则是基于分区消费的,即一个消费组里的每个消费者就绑定一个分区进行消费,每个分区维护着自己独立的偏移量,在开发时,生产者也能通过相应的策略在自行确定数据被分发到哪个分区。它的特点则是:
1,从微观层面来说,在某一时刻,多个分区的数据是会被同时消费的。
2,kafka只保证单分区内的数据有序,不保证整体有序。
3,线上的实时扩容分区或缩容分区比较困难。

二,分区内的文件存储机制

kafka会将生产者的数据按照相应的分发策略分发到对于的分区进行存储,每个分区的数据会按照一定大小的segmen进行划分,每个segment会有三个文件,分别是log数据日志文件、index偏移量索引文件、timeindex时间戳索引文件文件,这三个文件的文件名都是当前segment第一条数据的偏移量。
在这里插入图片描述log文件数据主要存储这3列数据,消息本体、偏移量索引、时间戳索引。
index文件数据主要存储两列数据,分别是offset和position,offset就是面向业务的,即一个偏移量代表业务侧的一条消息,且文件里存储的offset是相对的;position则是代表数据以字节为单位存储的字节长度,是面向机器去做寻址的。

1,磁盘的顺序IO

对于log数据的写入,都是以日志追加形式的,所以读和写都是顺序的磁盘IO,比随机的磁盘IO性能高更多。

2,索引机制

上面有说到index文件存储的就是offset和position数据,它的作用就是让kafka根据业务侧的offset数据来定位对应的数据位于文件的哪个位置,即一个索引查询的作用。且kafka这里采用的是稀疏所以的机制,即为防止index过于冗余,并不是每个offset都有其对应的position数据,而是累计一批offset之后绑定一个position。具体多少个offset绑定一个position,这个是可以配置的。

3,批量文件压缩

为了节约磁盘空间,通常数据在kafka文件的存储并不是明文存储的,而是会经过压缩。具体的压缩与解压缩的流程是,生产者将数据压缩之后交给kafka的broker,kakfa就按照该压缩数据存储,然后消费者拿到这个压缩数据之后自行进行解压。具体的压缩算法可以通过配置修改,kafka支持常用gzip、snappy、lz4等。
总的来说就是:producer压缩,kafka保持,consumer解压缩

4,零拷贝

一个典型的场景:线程需要获取磁盘中的数据,然后走rpc发送到网络中。传统的数据拷贝流程如下:
在这里插入图片描述

磁盘–》内核缓冲区–》用户缓冲区–》socket缓冲区–》网卡
由此可知,是经历了4次数据拷贝,但是kafka这里场景比较特殊的一点是,kafka的用户缓存区这一步不需要对数据做任何的修改处理,即是需要把磁盘里最原始的数据发送出去,所以拷贝到用户缓冲区这一步属于性能浪费,采用了零拷贝技术之后的数据拷贝流程是:
磁盘–》内核缓冲区–》socket缓冲区–》网卡,减少为了3次拷贝,之所以叫零拷贝,是因为相对于用户态来说没有了数据拷贝,零拷贝的技术有sendfile、splice等,kafka采用的是sendfile。

三,数据消费机制

主要就两个关键字:批量消费+长连接
批量消费即每次消费者从kakfa获取数据的时都是批量获取的,如每次请求获取100条。批量获取可以减少网络IO次数从而提升性能。
若消费者在一次数据获取时候,剩余的数据不足100条了,那会消费者与kafka会先维持一个长连接,等待一个超时时间(可配置),在该时间内若满100条了就返回,若还是不满则超时时间过了也会返回。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值