资讯专栏INFORMATION COLUMN

为什么Kafka这么快,解密Kafka高性能背后的秘密

CNZPH / 2954人阅读

摘要:看下图,就行一个高压水枪他的流速快横截面积小,吞吐量不高处理速度快。而采用完全相反的设计横截面积大,吞吐量高处理速度慢。黄色为随机读写,蓝色为顺序读写。

介绍

说起 Kafka 很多同学都知道,即使你没有用过也知道,它是消息队列中数一数二的运动健将,他可以承载每秒钟上百万此的数据处理,但问什么 Kafka 可以这么快呢?

归纳原因主要有这四点原因,磁盘顺序读写、页缓存、零拷贝、批量操作。

对比 RocketMQ

说到 Kafka 有一个话题我们无法回避,就是与其他消息队列的对比。这里我们以 RocketMQ 为例,Kafka 与 RocketMQ 有着完全不同的使用场景。

看下图,RocketMQ 就行一个高压水枪他的流速快横截面积小,吞吐量不高处理速度快。而Kafaka 采用完全相反的设计横截面积大,吞吐量高处理速度慢。


四大特点

1. 顺序读写

为什么顺序读写快呢,来看下面一篇测试文章,有权威的测试分别对机械硬盘、固态硬盘、内存进行随机与顺序读写测试。

黄色为随机读写,蓝色为顺序读写。可以看到随机读写性能依次是机械硬盘、固态硬盘、内存。而顺序读写机械硬盘反而强于固态硬盘,对于企业来说存储空间SSD、内存是非常昂贵的。所以 Kafaka 在设计的时候也是根据这个进行来顺序存储的。

在 Kafka 中一个概念叫做 Partition ,分区的意思用来存储消息,生产者生产的消息都是从末尾进行添加。

这里设计到一个新的问题,就是消费过的消息消费了之后进行删除不就破坏了消息的顺序关系了吗。这里 Kafka 做了个折中的处理,不进行实时的消息删除,而是在某个时间进行批量删除的,这个比单个删除效率要高。

2. 页缓存

页缓存相对来说比较简单,页缓存在操作系统层面是保存数据的一个基本单位,Kafka 避免使用 JVM,直接使用操作系统的页缓存特性提高处理速度,进而避免了JVM GC 带来的性能损耗。

3. 零拷贝

作为 Kafka 运行在 Linux 操作系统,作为 Linux 操作系统,它有一个特性叫做零拷贝。就是在用户态与内核态不再发生拷贝。

接下来我使用更加形象化进行解释,来看下图。假设现在有一条数据需要应用程序进行操作,但是他现在存储在磁盘上。操作系统层面会将磁盘信息加载到页缓存,之后再 copy 到应用层面的应用内存,需要发送的时候再加载到 socket 缓冲区。

但 Kafka 不是这么做的,来看下图。当数据需要操作会加载到内核态的页缓存中,需要发送是再加载到 socket 缓冲区中。其中就少了与用户态之间的 copy 动作,如果再处理海量数据的时候,效率就提高了很多。

4. 批量操作


最后一个呢是批处理,同学可以想一下在 JDBC 中数据库的操作,会有些批量处理操作,它用来提高网络利用率与数据库执行效率。

在 kafka 中页提高了大量批处理的 API ,可以对数据进行统一的压缩合并,通过更小的数据包在网络中进行数据发送,再进行后续处理,这在大量数据处理中,效率提高是非常明显的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119970.html

相关文章

  • 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我技术选型了

    摘要:维度消息事务支持支持。使用事务会使得性能有所下降不支持支持支持维度负载均衡支持负载均衡。发送消息通过轮询队列的方式发送,每个队列接收平均的消息量。 1、引言 对于即时通讯系统(包括IM、消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市面上种类众多、各有所长的MQ消息中件间产品,该怎么去选择?这是个问题! 对于很多经验不足的开发者来说,一个公司内部用的IM聊天系统,总用户量...

    sf190404 评论0 收藏0
  • 必看!java后端,亮剑诛仙(最全知识点)

    摘要:鉴于目前大多数服务器环境都是,提前接触能够相辅相成。正则也是必须要掌握的一个知识点。有多种创建多线程的方式,不过目前使用线程池的多一些。 原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。 你可能有所感悟。零散的资料读了很多,但是很难有提升。到处是干货,但是并没什么用,简单来说就是缺乏系统化。另外,噪音太多,雷同的框架一大把,我不至于全都要去学了吧。 这里,我...

    陈江龙 评论0 收藏0
  • Kafka什么速度那么

    摘要:后面简称也被翻译成内存映射文件,在位操作系统中一般可以表示的数据文件,它的工作原理是直接利用操作系统的来实现文件到物理内存的直接映射。完成映射之后你对物理内存的操作会被同步到硬盘上操作系统在适当的时候。 showImg(https://segmentfault.com/img/bVbsVc3?w=400&h=170);本文来源 | www.cnblogs.com/binyue/p/10...

    CloudDeveloper 评论0 收藏0
  • 听说看了这份Java学习路线同学,毕业都拿到了大厂offer

    摘要:服务层这一层有点东西了,算是整个框架的核心,如果你跟敖丙一样以后都是从事后端开发的话,我们基本上整个技术生涯,大部分时间都在跟这一层的技术栈打交道了,各种琳琅满目的中间件,计算机基础知识,操作,算法数据结构,架构框架,研发工具等等。 前言 自学/学习路线这样的一期我想写很久了,因为一直想写的...

    Dean 评论0 收藏0
  • kafka

    摘要:生产者和消费者生产者将数据发布到他们选择的。如果领导者失败,其中一个粉丝将自动成为新的领导者。每过,消费者会自动把从方法接收的最大提交上去。在回应之前一直阻塞,限制了应用程序的吞吐量。只有同步的才能在当前宕机时被选定为新的。 该博客迁移到github:https://github.com/dackh/blog 基础架构及术语 showImg(https://segmentfault....

    Half 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<