JAVA-消息中间件-kafka

高吞吐低延迟的高并发、高性能的KAFKA原理

kafka在大数据领域有着极其广泛的应用。一个配置好的kafka集群能够达到几十万甚至上百万的并发写入。
kafka的这种高性能可以从两个方面来进行描述:

在kafka进行数据写入时,采用 页缓存技术磁盘顺序写

页缓存技术:
在kafka每次接收到数据都会往上磁盘进行写数据。

在这里插入图片描述
但是这样是有一个问题:把数据写入到磁盘上,这样的工作效率是很低的。
在kafka中,已经解决掉了这个问题,采用的是:页缓存技术。
在这里插入图片描述
如上图所示:在kafka把数据写入到磁盘之前,先写入到一块叫page cache的缓存中。
page cache:操作系统本身有一层缓存,叫做 page cache ,是内存里的缓存,也可以称之为 OS cache 。即操作系统自己管理的缓存。

在kafka中是把消息写入到OS cache缓存中,也仅仅是写入到OS cache 中,然后由这块内存自己来决定什么时候来写入到磁盘中。

磁盘顺序写:
将数据追加到文件的末尾,而不是随便找到位置来写入。
对于普通的机械硬盘来说,如果随机找位置进行数据的写入,性能会极差。如果是采用顺序的方式进行写入数据,其性能堪比写内存。

所以如上图所示:
1.kafka在写数据时,基于OS层面的page cache 来进行写入,其实质就是写入内存,性能极高。
2.另一方面,kafka采用顺序写的方式,即使数据刷新到磁盘的时候,其性能也是可以堪比写内存的。

以上两点使kafka在写数据方面性能极高


kafka在写方面进行设置性能优化,同样在读方面也进行了设置优化—零拷贝技术

我们把数据给kafka进行数据写入,当我们需要数据的时候也是从kafka中进行读数据进行消费。
消费的实际过程:从kafka的磁盘文件中读取到某条文件然后给消费者。
在这里插入图片描述
如果kafka不进行读取数据的优化,就像上图一样,消费者的数据是从磁盘文件中获得即:
在读取数据时,先从OS cache中获得数据,没有则从磁盘文件中得到数据后放入到OS cache中。然后操作系统将OS cache中拷贝到应用进程缓存中,然后再从应用进程缓存中拷贝到Socket缓存中(两次拷贝),最后把数据从Socket缓存中发送到网卡,网卡发送给消费者进行消费。如下图:
在这里插入图片描述
在上图,能看到两次拷贝,这两次拷贝是没有必要的,并且会影响到性能。

在kafka中,对这两次拷贝进行了优化—零拷贝技术
即直接让操作系统的OS cache中的数据发送给消费者,直接跳过两次拷贝数据。在Scoket缓存中,仅仅是会存储一个描述,不会把数据拷贝到Socket缓存中。

在这里插入图片描述
零拷贝技术:不用再把数据拷贝到应用进程缓存中,再拷贝到Scoket缓存中,省略了两次拷贝。
对Scoket缓存仅仅是拷贝了拷贝数据的描述符过去,数据直接发送给了网卡给了消费者,这样大大提升了数据消费读取文件数据的性能。

综上:
经过良好调优后的kafka集群,可以实现把数据直接缓存到OS cache内存中,然后读数据直接从OS cache中进行读取。整个过程都在内存中进行数据的存储和读取,集群的整体性能会极高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值