架构初探 · 消息队列Kafka为什么这么快
你知道吗?
1、kafka是什么?
2、kafka的使用场景?
3、kafka处理速度有多快?
kafka,奥利奥,舔舔,扭扭,泡泡,真香。作为一个技术舔狗,怎么可能不去努力舔他呢?去深入浅出,去上下求索。
1、kafka是什么
kafka是什么?借用官网的一幅图,一段话,身为技术的舔狗,我们舔舔他的魅力。kafka,一个用来构建实时数据管道和流应用程序。它具有水平伸缩性,容错性,飞快运行,并且已经运行在上千家公司的产品中。wow。so cool,用它。
首先,他是一个分布式流数据处理平台。从这个角度来说,一个流平台需要具备三个关键能力:
- 发布订阅消息流,消息队列,或者消息发布系统。
- 高容错,持久化存储消息流。
- 当消息流到达时,高速处理。
毫无疑问,kafka是具备这些能力的。正如官网所说,
- kafka适合用来构建几个系统之间稳定可靠获取数据的实时数据流通。
- kafka适合用来构建实时数据处理的应用。
以上内容来自官网,有英语35级的小白搬运。
02
kafka的使用场景
企业的系统运转,总是会时时刻刻地产生数据,我们都是数据马车上的工程师,企业能走得有多远,要看马车,马车很多,作用各不相同,有些内有乾坤,存住海量数据,有些思维智能,分析海量数据,相互协作,为公司红尘滚滚,策马奔腾。
一家牛逼的公司,总是会出动许许多多的马车,不,是像始皇帝那样的战车,一剑指,万马冲。那么,大家跑着跑着,数据源源不断产生,总是会成为信息孤岛,数据得流通呀。怎么获取数据,分析数据呢?
一匹战马一天产生一个亿的数据,十匹,10亿,百匹,百亿。我们的kafka这时候就闪亮登场,数据源源不断地产生,源源不断地发送给kafka,kafka就是数据流里的那座跨海大桥,把一座座孤岛串联起来。拓展疆土的战马通过kafa流转数据,提供给智能战马分析数据,创造价值,指明方向。
03
kafka处理速度有多快
数据那么多,能处理过来才怪,想想挑剔又可爱的架构师们,头发能日渐残花,还不是为了做个快男吗?系统必须要快,快,快,快到看不见。那么kafka能满足要求么?基于上文我们可以知道kafka是要持久化存储到磁盘的。
kafka每次写入数据都写入磁盘,那么很明显速度肯定无法保证。我们总是用吞吐量来描述性能有多快,一秒钟能处理多少数据是检验的一个标准。而kafka单机可以支持每秒几十万消息写入,这样的性能怪兽,舔他。
那么为什么kafka的性能为什么这么快呢?高吞吐的实现,必须要依赖于低延迟,而kafka是基于磁盘存储的,这明显会使得kafka不可能这么快,那么就要提到kafka的极其牛逼的架构设计。
- kafka自己不管理缓存,每次写入磁盘,首先写入到操作系统的page cache。
首先我们普及一下什么是操作系统的page cache。当我们的业务系统或者应用想要 读取磁盘文件的时候,操作系统会先分配一些内存,将数据先加载到这些内存 中,然后再由系统读取。当我们的系统要将数据写入到磁盘,也会由操作系统先分配内存,数据会先写入内存,再有操作系统写入磁盘。
而kafka就是基于这样的设计。所以说,其实每次kafka的写入并没有直接发生磁盘IO,写入的大部分数据都是停留在操作系统的page cache里面。
相应的,当需要读取数据的时候,page cache里面的数据缓存的愈多,读取的速度也会相应提升。这里说明一下,优秀的框架都会相似之处,ES也采用了类似的设计。
2. 磁盘的写入是顺序写入,而不是随机写入。
kafka写磁盘文件的时候是追加写入到文件末尾,磁盘顺序写入,这样子的性能是很高的,比磁盘随机写入高了好几个level。
3.利用sendfile机制,实现零拷贝技术,优化了Kafka进程和操作系统的上下文切换的次数,减少了数据拷贝的次数。
我们这里来思考一下,当我们业务系统要从kafka中读取数据的时候,是怎么个流程?
- 首先Kafka进程肯定先是从page cache中去读,没有读到就会从磁盘读取,当读到数据之后就会缓存到操作系统的一个page cache里面。
- 上下文切换到Kafka进程,将操作系统的page cache中的缓存数据拷贝到业务系统内存中,比如jvm内存中。
- 上下文切换到操作系统,将Kafka进程中的内存数据拷贝到socket cache中。
- 最终数据拷贝到网卡的buffer,通过网卡发送给消费端业务系统。
这其中我们可以看到有多次上下文切换和内存数据拷贝的过程,内核空间和用户空间频繁进行数据拷贝,这样子来说是很浪费性能的。
第2步和第3步要是能省略,将page cache里面的数据直接发送到网卡的buffer,这样子性能能提升好多。而这个就是零拷贝的一种实现,性能相当高。
可以看到kafka本质上就是希望通过数据读写都尽可能在操作系统的内存中完成,而不是频繁进行用户态和系统内核态之间的拷贝。这样子大大提升读写的性能。
相关文章
- Kafka入门实战教程(2)基于Docker搭建Kafka环境
- flume和kafka区别
- 【源码分析】Kafka分区重分配/迁移(kafka-reassign-partitions.sh)
- 大数据必知必会之Kafka
- 大数据架构系列:Clickhouse + Kafka 的方案组合
- 一篇全搞定Kafka
- kafka删除topic消息的四种方式[通俗易懂]
- Kafka 删除topic_kafka自动创建topic
- 画图搞懂Kafka的高可用方案-ISR机制如何保证写入数据时主从的数据同步
- Kafka消息分区&producer拦截器&无消息丢失(八)
- kafka单条消息过大导致线上OOM,运维连夜跑路了!
- 基于Kafka的六种事件驱动的微服务架构模式
- Kafka、RabbitMQ、Pulsar、RocketMQ基本原理和选型
- 不背锅运维:消息队列概念、kafka入门、Kafka Golang客户端库
- 14 张图详解 Zookeeper + Kafka on K8S 环境部署
- Kafka消费与心跳机制详解大数据
- 深入探究Kafka与Redis的对比(kafka与redis)
- 基于Redis和Kafka的可扩展架构(rediskafka)
- Kafka系列一- Kafka背景及架构介绍
- Linux下搭建Kafka Stream架构的实践(linux kafka)
- Oracle与Kafka新一代数据处理技术(oracle与kafka)