前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >架构初探 · 消息队列Kafka为什么这么快

架构初探 · 消息队列Kafka为什么这么快

作者头像
简熵
修改2023-03-07 09:40:54
3990
修改2023-03-07 09:40:54
举报
文章被收录于专栏:逆熵逆熵

你知道吗?

1、kafka是什么?

2、kafka的使用场景?

3、kafka处理速度有多快?

kafka,奥利奥,舔舔,扭扭,泡泡,真香。作为一个技术舔狗,怎么可能不去努力舔他呢?去深入浅出,去上下求索。

1、kafka是什么

kafka是什么?借用官网的一幅图,一段话,身为技术的舔狗,我们舔舔他的魅力。kafka,一个用来构建实时数据管道流应用程序。它具有水平伸缩性,容错性,飞快运行,并且已经运行在上千家公司的产品中。wow。so cool,用它。

首先,他是一个分布式流数据处理平台。从这个角度来说,一个流平台需要具备三个关键能力:

  1. 发布订阅消息流,消息队列,或者消息发布系统。
  2. 高容错,持久化存储消息流。
  3. 当消息流到达时,高速处理。

毫无疑问,kafka是具备这些能力的。正如官网所说,

  1. kafka适合用来构建几个系统之间稳定可靠获取数据的实时数据流通。
  2. kafka适合用来构建实时数据处理的应用。

以上内容来自官网,有英语35级的小白搬运。

02

kafka的使用场景

企业的系统运转,总是会时时刻刻地产生数据,我们都是数据马车上的工程师,企业能走得有多远,要看马车,马车很多,作用各不相同,有些内有乾坤,存住海量数据,有些思维智能,分析海量数据,相互协作,为公司红尘滚滚,策马奔腾。

一家牛逼的公司,总是会出动许许多多的马车,不,是像始皇帝那样的战车,一剑指,万马冲。那么,大家跑着跑着,数据源源不断产生,总是会成为信息孤岛,数据得流通呀。怎么获取数据,分析数据呢?

一匹战马一天产生一个亿的数据,十匹,10亿,百匹,百亿。我们的kafka这时候就闪亮登场,数据源源不断地产生,源源不断地发送给kafka,kafka就是数据流里的那座跨海大桥,把一座座孤岛串联起来。拓展疆土的战马通过kafa流转数据,提供给智能战马分析数据,创造价值,指明方向。

03

kafka处理速度有多快

数据那么多,能处理过来才怪,想想挑剔又可爱的架构师们,头发能日渐残花,还不是为了做个快男吗?系统必须要快,快,快,快到看不见。那么kafka能满足要求么?基于上文我们可以知道kafka是要持久化存储到磁盘的。

kafka每次写入数据都写入磁盘,那么很明显速度肯定无法保证。我们总是用吞吐量来描述性能有多快,一秒钟能处理多少数据是检验的一个标准。而kafka单机可以支持每秒几十万消息写入,这样的性能怪兽,舔他。

那么为什么kafka的性能为什么这么快呢?高吞吐的实现,必须要依赖于低延迟,而kafka是基于磁盘存储的,这明显会使得kafka不可能这么快,那么就要提到kafka的极其牛逼的架构设计。

  1. kafka自己不管理缓存,每次写入磁盘,首先写入到操作系统的page cache。

首先我们普及一下什么是操作系统的page cache。当我们的业务系统或者应用想要 读取磁盘文件的时候,操作系统会先分配一些内存,将数据先加载到这些内存 中,然后再由系统读取。当我们的系统要将数据写入到磁盘,也会由操作系统先分配内存,数据会先写入内存,再有操作系统写入磁盘。

而kafka就是基于这样的设计。所以说,其实每次kafka的写入并没有直接发生磁盘IO,写入的大部分数据都是停留在操作系统的page cache里面。

相应的,当需要读取数据的时候,page cache里面的数据缓存的愈多,读取的速度也会相应提升。这里说明一下,优秀的框架都会相似之处,ES也采用了类似的设计。

2. 磁盘的写入是顺序写入,而不是随机写入。

kafka写磁盘文件的时候是追加写入到文件末尾,磁盘顺序写入,这样子的性能是很高的,比磁盘随机写入高了好几个level。

3.利用sendfile机制,实现零拷贝技术,优化了Kafka进程和操作系统的上下文切换的次数,减少了数据拷贝的次数。

我们这里来思考一下,当我们业务系统要从kafka中读取数据的时候,是怎么个流程?

  1. 首先Kafka进程肯定先是从page cache中去读,没有读到就会从磁盘读取,当读到数据之后就会缓存到操作系统的一个page cache里面。
  2. 上下文切换到Kafka进程,将操作系统的page cache中的缓存数据拷贝到业务系统内存中,比如jvm内存中。
  3. 上下文切换到操作系统,将Kafka进程中的内存数据拷贝到socket cache中。
  4. 最终数据拷贝到网卡的buffer,通过网卡发送给消费端业务系统。

这其中我们可以看到有多次上下文切换和内存数据拷贝的过程,内核空间和用户空间频繁进行数据拷贝,这样子来说是很浪费性能的。

第2步和第3步要是能省略,将page cache里面的数据直接发送到网卡的buffer,这样子性能能提升好多。而这个就是零拷贝的一种实现,性能相当高。

可以看到kafka本质上就是希望通过数据读写都尽可能在操作系统的内存中完成,而不是频繁进行用户态和系统内核态之间的拷贝。这样子大大提升读写的性能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 逆熵架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档