【消息队列】Kafka如何实现高性能IO

这篇具有很好参考价值的文章主要介绍了【消息队列】Kafka如何实现高性能IO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们直到Kafka是一个自称高性能的消息队列引擎,一般来说对于中间件的设计需要从计算、存储、网络三方面进行下手,而消息从产生到消费,也会经历多个流程,比如在生产者端采用异步\同步方式发送,采用高效的压缩算法,高效的序列化方式,以及网络IO等。那么Kafka主要实现高性能IO的。

批量消息发送

我们直到通过send方法,不管是同步还是异步方式,消息都会直接先暂存到内存中,然后等够一批数据消息后,才会发送到broker端,而Broker端不会将消息进行拆解,而是按照一个批量消息为一个单位进行处理,我们假设处理一个单条消息到Broker端需要1ms,那么需要1S中最多处理1000个消息,但是如果是批量发送,那么1S中处理的消息肯定是对于1000个消息的。因为这个途中会涉及本地IO、网络IO、数据拷贝等。
构建批消息和解开批消息分别在发送端和消费端的客户端完成,不仅减轻了 Broker 的压力,最重要的是减少了 Broker 处理请求的次数,提升了总体的处理能力。

顺序读写提升磁盘 IO 性能

我们直到磁盘顺序读写要比随机读写速度快很多,最根本的是可以减少寻址操作。

Kafka也利用这个顺序读写的机制,来提升IO性能,在消息发送到Broker的时候,会按照分区 将消息顺序写到Log文件中,而消费者在消费的时候,也是按照log文件进行读。当一个文件写完或者读完就会生成下一个文件。
充分利用了顺序读写这个特性,极大提升了 Kafka 在使用磁盘时的 IO 性能。

PageCache 加速消息读写

在 Kafka 中,它会利用 PageCache 加速消息读写。PageCache 是现代操作系统都具有的一项基本特性。通俗地说,PageCache 就是操作系统在内存中给磁盘上的文件建立的缓存。无论我们使用什么语言编写的程序,在调用系统的 API 读写文件的时候,并不会直接去读写磁盘上的文件,应用程序实际操作的都是 PageCache,也就是文件在内存中缓存的副本。
【消息队列】Kafka如何实现高性能IO
写数据流程,应用程序在写入数据的时候,先将数据写入到PageCache中,然后在一批批写入到磁盘中。
读数据流程,一个是pageCache中有数据,直接返回。没有数据从磁盘中读取到数据后,写入到pageCahce中,这个之后从pageCache读取数据。
数据淘汰算法,采用LRU 可以将最近写入的数据,提升读的能力。
Kafka 在读写消息文件的时候,充分利用了 PageCache 的特性。一般来说,消息刚刚写入到服务端就会被消费,按照 LRU 的“优先清除最近最少使用的页”这种策略,读取的时候,对于这种刚刚写入的 PageCache,命中的几率会非常高。

也就是说,大部分情况下,消费读消息都会命中 PageCache,带来的好处有两个:一个是读取的速度会非常快,另外一个是,给写入消息让出磁盘的 IO 资源,间接也提升了写入的性能

ZeroCopy:零拷贝技术

我们直到服务端Broker在处理消费时候,会先从磁盘上读取数据,如果命中pageCache的话 直接返回,然后将数据读取到应用程序中,通过网络socket发送出去。

未使用零拷贝

  • 先从磁盘读取数据,如果数据在pageCache中返回,没有从磁盘读取。写入到用户缓冲区。然后将用户缓冲区数据写到socket缓冲区,最后写到网卡缓冲区。
    【消息队列】Kafka如何实现高性能IO

使用零拷贝

从图中可以得知 可以把数据直接从pageCache中写到Socke缓冲区中,减少1/2次数据拷贝的过程,而这就是DMA技术,
【消息队列】Kafka如何实现高性能IO

小结

本篇主要介绍了Kafka的高性能IO设计,其实本质上都是从计算、存储、网络三个方面进行入手。而高性能的目的是实现高吞吐量,以及提升系统的并发容量。而高可用则是避免出现单点故障,通过服务冗余、分片、分区等方式实现系统的可用。文章来源地址https://www.toymoban.com/news/detail-412115.html

到了这里,关于【消息队列】Kafka如何实现高性能IO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • RocketMQ on openEuler 提供高性能消息队列的稳定性解决方案

    RocketMQ on openEuler,是一种将 RocketMQ 消息中间件通过容器化的方式部署在 openEuler 操作系统上运行,借助 openEuler 系统对于 OS 缓存回收效率增强的内核特性,提升消息中间件在面向超大规模高并发、高吞吐量、低延迟场景下稳定性和可靠性的软件解决方案。 移动云 RocketMQ 消息

    2024年02月11日
    浏览(54)
  • Docker与Kafka:实现高性能流处理

    Docker 和 Kafka 都是现代技术中的重要组成部分,它们各自在不同领域发挥着重要作用。Docker 是一个开源的应用容器引擎,用于自动化部署、创建、运行和管理应用程序。Kafka 是一个分布式流处理平台,用于构建实时数据流管道和流处理应用程序。 在大数据和实时数据处理领域

    2024年02月20日
    浏览(54)
  • 多路转接高性能IO服务器|select|poll|epoll|模型详细实现

    那么这里博主先安利一下一些干货满满的专栏啦! Linux专栏 https://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482 操作系统专栏 https://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482 手撕数据结构 https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014.3001.5482 去仓库获

    2024年02月15日
    浏览(62)
  • kafka高吞吐、低延时、高性能的实现原理

    作者:源码时代-Raymon老师 Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万,这其中的

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

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

    2024年01月22日
    浏览(70)
  • 【Redis】Redis 高性能IO模型原理

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

    2024年02月04日
    浏览(54)
  • uni-app如何实现高性能

    这篇文章主要讲解uni-app如何实现高性能的问题? 什么是uni-app? 简单说一下什么是uni-app,uni-app是继承自vue.js,对vue做了轻度定制,并且实现了完整的组件化开发,并且支持多端发布的一种架构,开发的项目可适配多平台。 过内前端开发的大致分歧  国内前端开发生态现在的

    2024年04月11日
    浏览(41)
  • 高性能消息中间件 RabbitMQ

    消息队列 MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的 异步通信 。 同步通信相当于两个人当面对话,你一言我一语。必须及时回复: 异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系。 消息

    2024年02月11日
    浏览(107)
  • System.Threading.Channels 高性能异步队列

    System.Threading.Channels 是.NET Core 3.0 后推出的新的集合类型, 具有异步API,高性能,线程安全等特点,它提供一个异步数据集合,可用于生产者和消费者之前的数据异步传递。 它提供如下方法: BoundedChannelOptions Provides options that control the behavior of bounded ChannelT instances. 提供通道的行

    2024年01月24日
    浏览(49)
  • 高性能网络设计秘笈:深入剖析Linux网络IO与epoll

    本文分享自华为云社区《高性能网络设计秘笈:深入剖析Linux网络IO与epoll》,作者: Lion Long 。 epoll是Linux内核中一种可扩展的IO事件处理机制,可替代select和poll的系统调用。处理百万级并发访问性能更佳。 (1) 文件描述符越多,性能越差。 单个进程中能够监视的文件描述

    2024年02月16日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包