kafka高吞吐、低延时、高性能的实现原理

这篇具有很好参考价值的文章主要介绍了kafka高吞吐、低延时、高性能的实现原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:源码时代-Raymon老师

Kafka的高吞吐、低延时、高性能的实现原理

Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万,这其中的原由值得我们一探究竟,让我们一起掌握Kafka各种精巧的设计。

吞吐量:吞吐量是指在一定时间内通过系统、网络或设备传输的数据量或处理的事务数量。它是衡量系统性能和效率的重要指标之一。

  • 对于网络,吞吐量可以指网络连接的数据传输速率,单位可以是字节/秒或比特/秒
  • 对于服务器或数据库系统,吞吐量可以表示系统每秒能够处理的事务或请求的数量
  • 在存储系统中,吞吐量可以表示系统每秒读取或写入的数据量。

较高的吞吐量意味着系统能够更快地处理数据,而较低的吞吐量可能导致数据传输延迟和系统繁忙。

kafka,每毫秒可以处理1条数据,每秒可以处理1000条数据,这个单位时间内可以处理多少条数据,就叫做吞吐量,1000条数据,每条数据10kb,吞吐量相当于是每秒处理大概10mb的数据

kafka高吞吐、低延时、高性能的实现原理,《Kafka入门到精通》,kafka,分布式
低延迟:低延迟是指系统或应用在处理请求或传输数据时所需的时间尽可能地短。

如果来一条数据就处理一条数据,可能会导致每条数据要处理假设1毫秒,那么此时每秒可以处理1000条数据,这就是每秒的吞吐量,但是如果采用微批处理技术呢?比如说把10毫秒内的数据收集起来一共有1000条数据,接着一次性交给引擎来处理,1毫秒就把1000条数据给处理完了。那么1秒内就可以处理10万条数据,吞吐量直接提升100倍。

kafka高吞吐、低延时、高性能的实现原理,《Kafka入门到精通》,kafka,分布式
这个就是所谓的流式计算采用的微批处理技术,你一条一条处理,每条数据都需要启动新的计算资源,有网络开销,甚至是磁盘开销。但是你一次性处理1000条,跟你一次性处理1条其实是差不多的。

接下来我们看看Kafka的高吞吐以及低延时实现的底层原理是什么。

1、页缓存技术 + 磁盘顺序写

首先Kafka每次接收到数据都会往磁盘上去写,如下图所示:
kafka高吞吐、低延时、高性能的实现原理,《Kafka入门到精通》,kafka,分布式
如果把数据基于磁盘来存储,频繁的往磁盘文件里写数据,这个性能会不会很差?大家肯定都觉得磁盘写性能是极差的。

但是实际上Kafka在这里有极为优秀和出色的设计,就是为了保证数据写入性能,首先Kafka是基于操作系统的页缓存来实现文件写入的。(操作系统本身有一层缓存,叫做page cache,是在内存里的缓存,我们也可以称之为os cache,意思就是操作系统自己管理的缓存。)

在写入磁盘文件的时候,可以直接写入这个os cache里,也就是仅仅写入内存中,接下来由操作系统自己决定什么时候把os cache里的数据真的刷入磁盘文件中。
仅仅这一个步骤,就可以将磁盘文件写性能提升很多了,因为这里相当于是在写内存,不是在写磁盘,大家看下图:
kafka高吞吐、低延时、高性能的实现原理,《Kafka入门到精通》,kafka,分布式

光有页缓存这一点已经可以提升很多性能了,但是kafka在这里还使用到一个磁盘顺序写的技术,也就是说,仅仅将数据追加到文件的末尾,不是在文件的随机位置来修改数据。

对于一块硬盘,它有几个重要指标:顺序读写能力和随机读写能力. 若把硬盘比作一个仓库,硬盘中的数据比作仓库中各种各样的货物. 硬盘的读写比作仓库中一个工人的进货和出货. 这时如果一个工人需要取一个大电冰箱,虽然冰箱很大很重,但是工人却能很快完成,这就是顺序读写.
kafka高吞吐、低延时、高性能的实现原理,《Kafka入门到精通》,kafka,分布式
但如果一个工作需要同时取一瓶水,一个文具盒、一包面包、一个鼠标、一管牙膏等,虽然它们很小很轻,但工作必须跑遍整个仓库才能拿到它们. 因此,工人往往会做的更慢,这就是随机读写.

小结:
页缓存+磁盘顺序写的方式让kafka的写性能极高,最大程度减少了每条数据处理的时间开销,反过来就大幅度提升了每秒处理数据的吞吐量,一般kafka部署在物理机上,单机每秒写入几万到几十万条消息是没问题的。
这种方式同时也兼顾了低延迟和高吞吐两个要求,尽量把每条消息的写入性能压榨到极致,就可以实现低延迟的写入,同时对应的每秒的吞吐量自然就提升了,这也是kafka非常核心的一个底层机制。

2、零拷贝实现高性能读取

那么在消费数据的时候,需要从磁盘文件里读取数据后通过网络发送出去,这个时候怎么提升性能呢?
首先就是利用了page cache技术,之前说过,kafka写入数据到磁盘文件的时候,实际上是写入page cache的,没有直接发生磁盘IO,所以写入的数据大部分都是停留在os层的page cache里的(这个本质其实跟elasticsearch的实现原理是类似的)
kafka高吞吐、低延时、高性能的实现原理,《Kafka入门到精通》,kafka,分布式
然后在读取的时候,如果正常情况下从磁盘读取数据,先尝试从page cache读,读不到才从磁盘IO读,读到数据以后先会放在os层的一个page cache里,接着会发生上下文切换到系统那边,把os的读缓存数据拷贝到应用缓存里。
kafka高吞吐、低延时、高性能的实现原理,《Kafka入门到精通》,kafka,分布式
接着再次发生上下文切换到os层,把应用缓存的数据拷贝到os的socket缓存中,最后数据再发送到网卡上:【非零拷贝的实现方案
kafka高吞吐、低延时、高性能的实现原理,《Kafka入门到精通》,kafka,分布式
这个过程里,发生了好几次上下文切换,而且还涉及到了好几次数据拷贝,如果不考虑跟硬件之间的交互,起码是从os cache到用户缓存,从用户缓存到socket缓存,有两次拷贝是绝对没必要的。

但是如果用零拷贝技术,就是linux的sendfile,就可以直接把操作交给os,os看page cache里是否有数据,如果没有就从磁盘上读取,如果有的话直接把os cache里的数据拷贝给网卡了,中间不用走那么多步骤了:【零拷贝技术
kafka高吞吐、低延时、高性能的实现原理,《Kafka入门到精通》,kafka,分布式
跟上图一对比是不是零拷贝技术就快多了?所以呢,通过零拷贝技术来读取磁盘上的数据,还有page cahce的帮助,这个性能就非常高了。文章来源地址https://www.toymoban.com/news/detail-760325.html

到了这里,关于kafka高吞吐、低延时、高性能的实现原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图解Kafka高性能之谜(五)

            简单架构设计: 详细架构设计:          索引文件定位使用跳表的设计         偏移量定位消息时使用稀疏索引: kafka采用 sendFile ()的零拷贝方式,磁盘DMA到内存,然后一次cpu copy到socket缓存,一次DMA到网卡完成数据发送。 如下图,6条消息采用key可能分三次

    2024年02月08日
    浏览(33)
  • Kafka高性能集群部署与优化

    Kafka 是由Apache Software Foundation开发的一个分布式流处理平台,源代码以Scala编写。Kafka最初是由LinkedIn公司开发的,于2011年成为Apache的顶级项目之一。它是一种高吞吐量、可扩展的发布订阅消息系统,具有以下特点: 高吞吐量:Kafka每秒可以处理数百万条消息。 持久化:数据存

    2024年02月13日
    浏览(44)
  • 基于 Redis 实现高性能、低延迟的延时消息的方案演进

    🎉欢迎来系统设计专栏:基于 Redis 实现高性能、低延迟的延时消息的方案演进 📜其他专栏:java面试 数据结构 源码解读 故障分析 🎬作者简介:大家好,我是小徐🥇 ☁️博客首页:CSDN主页 小徐的博客 🌄每日一句: 好学而不勤非真好学者 📜 欢迎大家关注! ❤️ 随着

    2024年01月22日
    浏览(40)
  • Kafka 最佳实践:构建可靠、高性能的分布式消息系统

    Apache Kafka 是一个强大的分布式消息系统,被广泛应用于实时数据流处理和事件驱动架构。为了充分发挥 Kafka 的优势,需要遵循一些最佳实践,确保系统在高负载下稳定运行,数据可靠传递。本文将深入探讨 Kafka 的一些最佳实践,并提供丰富的示例代码,帮助读者更好地应用

    2024年02月03日
    浏览(42)
  • 【Redis】Redis 高性能IO模型原理

    在面试的时候遇到Redis肯定会问,Redis单线程为什么那么快呀?你可以说下你对IO多路复用的机制嘛。但是仔细一想Redis真的是单线程在运行处理嘛,其实这个单线程主要指的Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求,包括socket读取、解析、执

    2024年02月04日
    浏览(41)
  • 解析RocketMQ:高性能分布式消息队列的原理与应用

    什么是消息队列 消息队列是一种消息传递机制,用于在应用程序和系统之间传递消息,实现解耦和异步通信。它通过将消息发送到一个中间代理(消息队列),然后由消费者从该队列中获取消息并处理。 RocketMQ简介 RocketMQ是阿里巴巴开源的一款高性能分布式消息队列系统。它

    2024年02月14日
    浏览(35)
  • 【洁洁送书第一期】Python高并发与高性能编程: 原理与实践

    Python成为时下技术革新的弄潮儿,全民Python的发展趋势让人们不再满足于简单地运行Python程序,逐步探索其更为广泛的日常应用和高性能设计。 以ChatGPT为代表的大模型产品对初级程序开发人员提出了挑战,要想在开发领域站稳脚跟、有发展,必须掌握更高级的技巧和能力。

    2024年02月16日
    浏览(48)
  • 【大虾送书第三期】《Python高并发与高性能编程: 原理与实践》

    目录 ✨写在前面 ✨主要内容 ✨本书特色 ✨关于作者      🦐博客主页:大虾好吃吗的博客      🦐专栏地址:免费送书活动专栏地址 Python成为时下技术革新的弄潮儿,全民Python的发展趋势让人们不再满足于简单地运行Python程序,逐步探索其更为广泛的日常应用和高性能

    2024年02月16日
    浏览(37)
  • 《Python高并发与高性能编程:原理与实践》——小解送书第六期

    目录 书籍介绍  抽奖 Python成为时下技术革新的弄潮儿,全民Python的发展趋势让人们不再满足于简单地运行Python程序,逐步探索其更为广泛的日常应用和高性能设计。以ChatGPT为代表的大模型产品对初级程序开发人员提出了挑战,要想在开发领域站稳脚跟、有发展,必须掌握更

    2024年02月14日
    浏览(38)
  • 002. 使用最小堆实现高性能定时器实现

    定时器原理 – 任务的容器(要求:数据结构有序或相对有序;能快速查找最近触发的定时任务) + 触发条件(可以通过带有time_out的系统函数,如epoll_wait的最后一个参数); 最小堆的特点 – 是一颗完全二叉树; – 某个节点的值总是小于等于它子节点的值(即定位到最小值的时间

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包