在面对一些亿级流量场景,消息队列届的排头兵kafka是如何保证高性能的呢?

2023-05-16

在面对一些亿级流量场景,消息队列届的大哥kafka是如何保证高性能的呢?

  1. Kafka Reactor模型架构
    Kafka客户端和服务端通信采取的是NIO的reactor模式,它是一种事件驱动模式。reactor模型天然支持高并发,可以充分利用多核心多线程。
    https://blog.51cto.com/u_15067229/2573746

  2. 页缓存技术+磁盘顺序写
    2.1 操作系统每次从磁盘读写数据的时候,需要先寻址,也就是先要找到数据在磁盘上的物理位置,然后再进行数据读写。如果是机械硬盘,这个寻址需要比较长的时间,因为它要移动磁头,这是个机械运动,机械硬盘工作的时候会发出咔咔的声音,就是移动磁头发出的声音。
    顺序读写相比随机读写省去了大部分的寻址时间,它只要寻址一次,就可以连续地读写下去,所以说,性能要比随机读写要好很多。
    Kafka 就是充分利用了磁盘的这个特性。它的存储设计非常简单,对于每个分区,它把从Producer 收到的消息,顺序地写入对应的 log 文件中,一个文件写满了,就开启一个新的文件这样顺序写下去。消费的时候,也是从某个全局的位置开始,也就是某一个 log 文件中的某个位置开始,顺序地把消息读出来。
    2.2 在 Kafka 中,它会利用 PageCache 加速消息读写。PageCache 是现代操作系统都具有的一项基本特性。通俗地说,PageCache 就是操作系统在内存中给磁盘上的文件建立的缓存。无论我们使用什么语言编写的程序,在调用系统的 API 读写文件的时候,并不会直接去读写磁盘上的文件,应用程序实际操作的都是 PageCache,也就是文件在内存中缓存的副本。
    应用程序在写入文件的时候,操作系统会先把数据写入到内存中的 PageCache,然后再一批一批地写到磁盘上。读取文件的时候,也是从 PageCache 中来读取数据,这时候会出现两种可能情况。
    一种是 PageCache 中有数据,那就直接读取,这样就节省了从磁盘上读取数据的时间;另一种情况是,PageCache 中没有数据,这时候操作系统会引发一个缺页中断,应用程序的读取线程会被阻塞,操作系统把数据从文件中复制到 PageCache 中,然后应用程序再从PageCache 中继续把数据读出来,这时会真正读一次磁盘上的文件,这个读的过程就会比较慢。
    用户的应用程序在使用完某块 PageCache 后,操作系统并不会立刻就清除这个PageCache,而是尽可能地利用空闲的物理内存保存这些 PageCache,除非系统内存不够用,操作系统才会清理掉一部分 PageCache。清理的策略一般是 LRU 或它的变种算法,这个算法我们不展开讲,它保留 PageCache 的逻辑是:优先保留最近一段时间最常使用的那些 PageCache。
    Kafka 在读写消息文件的时候,充分利用了 PageCache 的特性。一般来说,消息刚刚写入到服务端就会被消费,按照 LRU 的“优先清除最近最少使用的页”这种策略,读取的时候,对于这种刚刚写入的 PageCache,命中的几率会非常高。
    也就是说,大部分情况下,消费读消息都会命中 PageCache,带来的好处有两个:一个是读取的速度会非常快,另外一个是,给写入消息让出磁盘的 IO 资源,间接也提升了写入的性能。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-roiliIY7-1651371448094)(https://www.hengyumo.cn/momoclouddisk/file/download?code=202204162045895_image.png)]

  3. ZeroCopy:零拷贝技术
    我们知道,在服务端,处理消费的大致逻辑是这样的:
    首先,从文件中找到消息数据,读到内存中;
    然后,把消息通过网络发给客户端。
    这个过程中,数据实际上做了 2 次或者 3 次复制:

  • 从文件复制数据到 PageCache 中,如果命中 PageCache,这一步可以省掉;
  • 从 PageCache 复制到应用程序的内存空间中,也就是我们可以操作的对象所在的内存;
  • 从应用程序的内存空间复制到 Socket 的缓冲区,这个过程就是我们调用网络应用框架的 API 发送数据的过程。
    Kafka 使用零拷贝技术可以把这个复制次数减少一次,上面的 2、3 步骤两次复制合并成一次复制。直接从 PageCache 中把数据复制到 Socket 缓冲区中,这样不仅减少一次数据复制,更重要的是,由于不用把数据复制到用户内存空间,DMA 控制器可以直接完成数据复制,不需要 CPU 参与,速度更快。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1I5XinF-1651371448095)(https://www.hengyumo.cn/momoclouddisk/file/download?code=202204162044983_image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OYKt2kL1-1651371448096)(https://www.hengyumo.cn/momoclouddisk/file/download?code=202204162044407_image.png)]

  1. 使用批量消息提升服务端处理能力
    我们知道,批量处理是一种非常有效的提升系统吞吐量的方法。在 Kafka 内部,消息都是以“批”为单位处理的。一批消息从发送端到接收端,是如何在 Kafka 中流转的呢?
    我们先来看发送端,也就是 Producer 这一端。
    在 Kafka 的客户端 SDK(软件开发工具包)中,Kafka 的 Producer 只提供了单条发送的send() 方法,并没有提供任何批量发送的接口。原因是,Kafka 根本就没有提供单条发送的功能,是的,你没有看错,虽然它提供的 API 每次只能发送一条消息,但实际上,Kafka的客户端 SDK 在实现消息发送逻辑的时候,采用了异步批量发送的机制
    当你调用 send() 方法发送一条消息之后,无论你是同步发送还是异步发送,Kafka 都不会立即就把这条消息发送出去。它会先把这条消息,存放在内存中缓存起来,然后选择合适的时机把缓存中的所有消息组成一批,一次性发给 Broker。简单地说,就是攒一波一起发。在 Kafka 的服务端,也就是 Broker 这一端,又是如何处理这一批一批的消息呢?
    在服务端,Kafka 不会把一批消息再还原成多条消息,再一条一条地处理,这样太慢了。
    Kafka 这块儿处理的非常聪明,每批消息都会被当做一个“批消息”来处理。也就是说,在Broker 整个处理流程中,无论是写入磁盘、从磁盘读出来、还是复制到其他副本这些流程中,批消息都不会被解开,一直是作为一条“批消息”来进行处理的。
    在消费时,消息同样是以批为单位进行传递的,Consumer 从 Broker 拉到一批消息后,在客户端把批消息解开,再一条一条交给用户代码处理。
    比如说,你在客户端发送 30 条消息,在业务程序看来,是发送了 30 条消息,而对于Kafka 的 Broker 来说,它其实就是处理了 1 条包含 30 条消息的“批消息”而已。显然处理 1 次请求要比处理 30 次请求要快得多。
    构建批消息和解开批消息分别在发送端和消费端的客户端完成,不仅减轻了 Broker 的压力,最重要的是减少了 Broker 处理请求的次数,提升了总体的处理能力。
    https://blog.csdn.net/qq_4278923/article/details/106785426
    https://blog.csdn.net/weixin_38499215/article/details/98750908
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在面对一些亿级流量场景,消息队列届的排头兵kafka是如何保证高性能的呢? 的相关文章

  • swift tableview cell自适应高度

    自适应高度达到的效果 实现方法 xff1a 1 xcode新建个项目 xff0c 选择 single View Application 2 打开main storyboard 将tableview 拖到view controller中 xf
  • PHP7 MongoDB 安装与使用

    PHP7 Mongdb 扩展安装 我们使用 pecl 命令来安装 xff1a usr local php7 bin pecl install mongodb 执行成功后 xff0c 会输出以下结果 xff1a Build process c
  • Qt5.6.1+win10环境安装

    安装步骤 xff1a 下载 Qt官方网址 xff1a https download qt io new archive qt 5 6 5 6 1 下载qt opensource windows x86 mingw492 5 6 1 exe
  • WebApp打包

    HBuilder打包 HBuilder是一款前端开发的工具 xff0c 可以到http www dcloud io 下载 下载安装后我们就开始打包已有项目了 xff0c 我们以vue项目为例 xff0c 保证vue项目正常运行 xff0c
  • 蓝牙模块基础认知

    一 模块类型 1 经典蓝牙模块 BT xff1a 泛指支持蓝牙协议4 0以下的模块 xff0c 一般用于数据量比较大的传输 经典蓝牙模块可再细分为 传统蓝牙模块和高速蓝牙模块 2 低功耗蓝牙模块 BLE xff1a 指支持蓝牙协议 4 0
  • Ubuntu下 Rust 交叉编译 Windows程序

    Ubuntu下 Rust 交叉编译 Windows程序 系统版本信息安装添加工具链执行交叉编译 系统版本信息 前提 xff1a 已根据Rust官网安装配置好Rust 当前系统信息如下 Ubuntu 22 04 LTS x64rustup 1
  • golang中日期操作,日期格式化,日期转换

    golang中并没有像java一样提供类似yyyy MM dd HH mm ss格式的操作 xff0c 而是将其定义为golang的诞生时间 xff1a 2006 01 02 15 04 05 0700 MST 注意这在golang的日期格
  • windows11连接无线网后分享热点连接不上

    一直很喜欢用电脑连接无线网再开热点的方式 xff0c 一个是学校热点一次只能连接两个设备 xff0c 另一个是感觉电脑发出的无线信号比较稳定 但是最近用电脑开热点发现虽然手机能连上 xff0c 但是显示无网络连接 xff0c 就是打不开网页
  • C语言实现——顺序栈(top开始为0,也就是top指针指向下一个我们能够插入的地方)

    span class token macro property span class token directive hash span span class token directive keyword define span span
  • Linux查询服务器保修信息

    dmidecode grep 34 System Information 34 A9 egrep 34 Manufacturer Product Serial 34
  • ubuntu20.04下配置深度学习环境GPU

    卸载子系统 C Users thzn gt wsl list 适用于 Linux 的 Windows 子系统分发版 docker desktop 默认 docker desktop data Ubuntu 18 04 Ubuntu 22 0
  • SpringSecurity登陆接口

    接下我们需要自定义登陆接口 xff0c 然后让SpringSecurity对这个接口放行 让用户访问这个接口的时候不用登录也能访问 在接口中我们通过AuthenticationManager的authenticate方法来进行用户认证 所以
  • 【ubuntu20】filezilla连接主机和ubuntu20

    1 普通用户登录 sudo apt update sudo apt install openssh server 安装ssh br sudo systemctl status ssh 确认是否运行 br sudo ufw allow ssh
  • CentOS7+Nginx+阿贝云服务器使用心得

    最近有一个项目需要使用云服务器展示demo xff0c 由于是临时使用就想找一个免费的云服务器 由于以前在阿里云 腾讯云 华为云 百度云 亚马逊云都用过免费版 xff0c 这次就在网上搜了一下其它的免费云 正好就找到了阿贝云 https w
  • WSL2运行sudo gnome-session没反应

    必须注意当前用户 xff0c 不一定是在root下创建的gnome session xff0c 以我为例 xff0c 我当时是在leo用户下安装的gnome session xff0c 但之后一直都是以root用户登录 xff0c 所以运行
  • n个人围成一圈,第一个开始报数(1-3),凡报数3退出。问最后留下的人是原来第几号?

    include lt stdio h gt int main int i 61 0 j 61 0 k 61 0 n x int a 100 printf 34 please input a nu 34 scanf 34 d 34 amp n
  • 使用sea-orm执行migrate

    源码github地址 seaormdemo 一 下载工具链 sea orm cli 是sea orm 提供的工具链 xff0c 可通过cargo下载 cargo span class token function install span
  • PVE安装更新源错误

    pve系统ping 网络不通且不能进行apt install 描述 root 64 xuyuquan span class token comment apt get update span Err 1 http ftp debian or
  • failed to run command ‘java’: No such file or directory

    failed to run command java No such file or directory 程序里远程执行shell命令 xff08 nohup java jar xff09 的执行 xff0c 后台日志报错如下 xff1a
  • vue3中的setup函数

    原文 xff1a vue3中的setup函数 落雪小轩韩的博客 CSDN博客 vue3setup 一 概念 xff1a setup是vue3中的一个新的配置项 xff0c 值为一个函数 xff0c 我们在组件中用到的数据 方法等等 xff0

随机推荐

  • vue同步请求

    原文地址 xff1a vue 同步请求 Aa duidui的博客 CSDN博客 vue同步请求 同步请求执行的顺序 async await 挂上的才是同步 没挂上的还是异步 async 方法名 await 请求方法 参数 then res
  • Anaconda上设置虚拟环境,并在jupyter notebook中切换。

    个人记录 xff0c 但欢迎阅读和赐教 我之前在Anaconda Navigator中建立虚拟环境 xff0c 然后在jupyter notebook的terminal中增加对应环境的ipykernel xff0c 这样可行 xff0c 但
  • 字符,字节和编码

    级别 xff1a 初级 摘要 xff1a 本文介绍了字符与编码的发展过程 xff0c 相关概念的正确理解 举例说明了一些实际应用中 xff0c 编码的实现方法 然后 xff0c 本文讲述了通常对字符与编码的几种误解 xff0c 由于这些误解
  • http协议原理

    HTTP工作原理 HTTP协议定义Web客户端如何从Web服务器请求Web页面 xff0c 以及服务器如何把Web页面传送给客户端 HTTP协议采用了请求 响应模型 客户端向服务器发送一个请求报文 xff0c 请求报文包含请求的方法 URL
  • TLS协议/SSL协议

    历史背景 SSL Secure Socket Layer 安全套接层 是基于HTTPS下的一个协议加密层 xff0c 最初是由网景公司 xff08 Netscape xff09 研发 xff0c 后被IETF xff08 The Inter
  • TCP协议

    TCP 基础 https www jianshu com p ef892323e68f TCP 使用固定的连接 TCP 用于应用程序之间的通信 当应用程序希望通过 TCP 与另一个应用程序通信时 xff0c 它会发送一个通信请求 这个请求必
  • UDP协议

    UDP 概述 xff08 User Datagram Protocol xff0c 用户数据报协议 xff09 用户数据报协议 UDP 只在 IP 的数据报服务之上增加了很少一点的功能 xff0c 这就是复用和分用的功能以及查错检测的功能
  • TCP和UDP的区别

    TCP协议与UDP协议的区别 首先咱们弄清楚 xff0c TCP协议和UDP协议与TCP IP协议的联系 xff0c 很多人犯糊涂了 xff0c 一直都是说TCP协议与UDP协议的区别 xff0c 我觉得这是没有从本质上弄清楚网络通信 xf
  • 网络协议概述

    互联网协议介绍 互联网的核心是一系列协议 xff0c 总称为 互联网协议 xff08 Internet Protocol Suite xff09 xff0c 正是这一些协议规定了电脑如何连接和组网 我们理解了这些协议 xff0c 就理解了互
  • go 编写tcp和udp服务端和客户端

    TCP协议 TCP IP Transmission Control Protocol Internet Protocol 即传输控制协议 网间协议 xff0c 是一种面向连接 xff08 连接导向 xff09 的 可靠的 基于字节流的传输层
  • tcp黏包问题

    服务端代码如下 xff1a span class token keyword package span main span class token keyword import span span class token punctuati
  • go sync.Pool 深入

    new函数的调用时机和pool的内存释放规则 以下代码调用了四次Get函数 xff0c 但是并不是每次都会new 第一次 xff0c 是a 61 pool Get byte xff0c 首次Get xff0c 在pool的private私有
  • 【AI理论学习】深入理解扩散模型:Diffusion Models(DDPM)(理论篇)

    深入理解扩散模型 xff1a Diffusion Models 引言扩散模型的原理扩散过程反向过程优化目标 模型设计代码实现Stable Diffusion DALL E Imagen背后共同的套路Stable DiffusionDALL
  • gin 框架原理

    Gin的路由原理 Gin的路由基于Trie树和压缩字典树算法 xff0c 什么是Trie树 xff1f 其实很好理解 xff0c 看下图 xff1a 单词at xff0c bee xff0c ben xff0c bt xff0c q组成的T
  • PowerDesigner导入sql脚本

    1 依次点击File gt Reverse Engineer gt Database 2 弹出弹窗对模型进行命名 xff0c 同时在DBMS下拉选择框中需要选择自己对应的数据库类型 xff0c 点击确定 新的弹窗 xff0c 选中Using
  • Gin路由算法模拟

    概述 Gin的路由算法是采用压缩字典树实现的 xff0c 基数树 xff08 Radix Tree xff09 又称为PAT位树 xff08 Patricia Trie or crit bit tree xff09 xff0c 是一种更节省
  • 使用gomail发送邮件

    概述 为了实现一个邮件验证码功能 xff0c 特意了解了一下go如何发送邮件 本来以为会很麻烦 xff0c 没想到其实很简单 工具类 实现的工具类如下 xff1a span class token keyword package span
  • redis实现消息队列的几种方式及其优劣

    概述 常用的消息队列有 xff0c rabbitMq kafka RocketMq ActiveMq等 这些消息队列需要独立安装部署 xff0c 作为一个中间件来提供服务 xff0c 虽然有着高性能 高可靠的优点 xff0c 但是额外部署这
  • linux系统或者windows WSL安装redis最新版本

    概述 因为windows的最新版本redis已经在16年就停止更新了 xff0c 目前最新的版本只到redis3 xff0c 很多redis新增的特性都无法使用 例如redis5的stream xff0c windows版本就没有 这篇文章
  • 在面对一些亿级流量场景,消息队列届的排头兵kafka是如何保证高性能的呢?

    在面对一些亿级流量场景 xff0c 消息队列届的大哥kafka是如何保证高性能的呢 xff1f Kafka Reactor模型架构 Kafka客户端和服务端通信采取的是NIO的reactor模式 xff0c 它是一种事件驱动模式 react