kafka 高吞吐设计分析

news2025/1/16 1:40:56

说明

  1. 本文基于 kafka 2.7 编写。
  2. @author blog.jellyfishmix.com / JellyfishMIX - github
  3. LICENSE GPL-2.0

概括

支撑 kafka 高吞吐的设计主要有以下几个方面:

  1. 网络 nio 主从 reactor 设计模式

  2. 顺序写。

  3. 零拷贝。

producer

  1. producer 开启压缩后是批量压缩,broker 不解压没有解压消耗,consumer 批量拉取并解压,实现端到端压缩。

broker

网络 nio 主从 reactor 设计模式

  1. nio 主从 reactor 模式和 tomcat, netty 类似。nio 主从 reactor 模式请见文章: https://blog.csdn.net/weixin_43735348/article/details/128445926
  2. 采用主从 reactor 的原因: acceptor 线程专门负责建立连接, selector 线程。acceptor 和 selector 线程资源隔离,且两个资源各自可以根据压力扩展线程数。

顺序读写

  1. kafka 写日志文件的时候用的是追加消息的形式,只在文件尾部顺序写消息。读时在文件头部顺序读取消息。不涉及修改消息,所以不需要随机写。
  2. 这样的设计即使用的是传统机械硬盘,访问速度也快。操作系统和硬件对顺序写和顺序读有优化,具体采用的是后写和预读(读时连带读出附近的页)。另外机械硬盘磁针寻址也对顺序读写更友好,对于机械硬盘大概顺序写比随机写快 3 个数量级。

零拷贝

  1. 非零拷贝发送数据过程: 用户执行系统调用读磁盘,用户态切换成内核态。硬盘上的数据通过 DMA 读入内核空间后,cpu 拷贝至用户空间,切换回用户态。执行网络 IO 系统调用,用户态切换成内核态,cpu 拷贝数据至内核空间(socket 缓存),通过 DMA 写入网卡。
    1. 存在两次 cpu 拷贝和两次内核态用户态切换浪费。

非零拷贝.png

  1. 零拷贝基于操作系统提供的系统调用 – sendfile()。用户执行系统调用切换至内核态,DMA 从硬盘拷贝数据至内核空间,socket 缓存写入内核空间中数据的地址等描述信息。由 DMA 把数据从内核空间传递至网卡。这样可节约两次 cpu 的拷贝开销。

零拷贝.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s部署微服务例子

一、部署服务 需要部署minio、nacos、mysql、consul、elasticsearch、视频解析服务、nfs、skywalking-oap及ui。 二、三个微服务程序 minio服务解析视频-》上传到minio进行存储,构造领域对象信息保存到hive(hive on spark)异步处理-》元数据…

c#程序报错引用无效解决办法之一:检查引用的文件路径

直接右键然后打开本地 打开这个.csproj文件,直接对着路径看看里面的路径对不对。 一般是很多人一起开发,然后这个文件路径被推送上来的问题

前端三剑客 —— CSS (第四节)

目录 内容回顾: 1.常见样式 2.特殊样式 特殊样式 过滤效果 动画效果 动画案例: 渐变效果 其他效果: 多列效果 字体图标(icon) 内容回顾: 1.常见样式 text-shadow x轴 y轴 阴影的模糊程度 阴影的…

kubectl explain资源文档命令

学习并使用了一段时间的kubernetes,发现对k8s还是了解甚少,于是利用上下班通勤的时间又去B站看一些大佬的视频,又来重学巩固一遍知识,并做些记录。 之前在学习使用过程中未成了解过explain这个命令,因为自己部署的版本…

一站式知识库服务平台真的有那么好用吗?看完你就懂了

在快速发展的信息化社会,我们经常会听到“知识就是力量”的这句话,而一个一站式的知识库服务平台就是这样一把“开启力量之门”的钥匙。那么,这把钥匙真的有那么好用吗?让我们一起探讨一下。 首先,“一站式”可能已经解…

vite.config.js

Vue3vite vite和webpack区别? 1.vite服务器启动速度比webpack快,由于vite启动的时候不需要打包,也就无需分析模块依赖、编译,所以启动速度非常快。当浏览器请求需要的模块时,再对模块进行编译,这种按需动态…

软件杯 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xf…

【T5中的激活函数】GLU Variants Improve Transformer

【mT5中的激活函数】GLU Variants Improve Transformer 论文信息 阅读评价 Abstract Introduction Gated Linear Units (GLU) and Variants Experiments on Text-to-Text Transfer Transformer (T5) Conclusion 论文信息 名称内容论文标题GLU Variants Improve Transfo…

AI绘画:实例-利用Stable Diffusion ComfyUI实现多图连接:区域化提示词与条件设置

在Stable Diffusion ComfyUI中,有一种高级技巧可以让用户通过细致的区域化提示词来控制图像的不同部分,从而实现多图连接的效果。这种方法允许艺术家在同一画布上展现多个场景,创造出富有层次和故事性的图像。以下是实现这一效果的详细步骤。…

【与C++的邂逅之旅】--- 内联函数 auto关键字 基于范围的for循环 nullptr

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა 博主专栏: 💡 与C的邂逅之旅 💡 数据结构之旅 上篇我们了解了函数重载和引用,我们继续学习有关C的一些小语法— 内联函数,auto关键字,基于范围的for循环以及 nullptr&…

element-ui empty 组件源码分享

今日简单分享 empty 组件的源码实现,主要从以下三个方面: 1、empty 组件页面结构 2、empty 组件属性 3、empty 组件 slot 一、empty 组件页面结构 二、empty 组件属性 2.1 image 属性,图片地址,类型 string,无默认…

Docker 安装 | 部署MySQL 8.x 初始设置

1、准备工作 如果不想看前面的废话请直接右边目录跳到 运行容器 处 默认你已经有 docker 环境。 Windows 推荐 Docker Desktop (下载地址)并基于 WSL2 运行 Docker 环境 mac 推荐 Orbstack (下载地址)(这个很节省资源&…

C++之函数提高(HM)

目录 1.函数默认参数(缺省参数) 2.占位参数 3.函数重载 4.类和对象--封装 (1)圆类: (2)访问权限 (3)struct&&class (4)立方体类的…

适用于车载设备无钥匙进入系统汽车用晶振FA-238A

汽车用晶振FA-238A是一款适用于车载设备无钥匙进入系统的耐高温晶振。汽车用晶振FA-238A是爱普生推出一的款MHz表贴式晶体单元,具有很好的预率性能,符合AEC-0200标准,其封装尺寸仅为3.2x2.5x0.7mm,工作温度范围在-40℃~125℃之间&…

Linux云计算之网络基础9——园区网络架构项目

要求构建大型园区网络架构,方案如下: 园区A 园区c 公司B 要求: 1、A公司园区网络 一台汇聚层三层交换机,两台接入层二层交换机。 出口有一台路由器。 2、A园区有五台服务器。 分别为两台 WEB 服务器,…

Spring Boot Mockito (三)

Spring Boot Mockito (三) 这篇文章主要是讲解Spring boot 与 Mockito 集成测试。 前期项目配置及依赖可以查看 Spring Boot Mockito (二) - DataJpaTest Spring Boot Mockito (一) - WebMvcTest Tag("Integration") SpringBootTest // TestMethodOrder(MethodOr…

分布式系统架构中的相关概念

1.1、衡量网站的性能指标 响应时间:指执行一个请求从开始到最后收到响应数据所花费的总体时间。并发数:指系统同时能处理的请求数量。 并发连接数:指的是客户端向服务器发起请求,并建立了TCP连接。每秒钟服务器连接的总TCP数量请…

MySQL 主从复制架构搭建及其原理

前言 系统的性能瓶颈一般出现在数据库上,以 mysql 为例,如果存在高并发的写请求,势必会有锁表,锁数据行的情况发生,这时候如果有读请求刚好访问到被锁的数据,那么读请求会阻塞,直到写请求处理完…

ctypes 封装c语言

一&#xff0c;python与C类型对应关系 最左边一列的ctypes type&#xff0c;以替代C库中的各种类型。 二&#xff0c;不带参数的调用 1&#xff0c;target.c #include <stdio.h>void hello_world(){printf("hello downey!!\r\n"); } 2&#xff0c;执行命令…

CKA 基础操作教程(二)

Kubernetes Deployment 理论学习 Kubernetes Deployment &#xff08;部署&#xff09;是一种 Kubernetes 资源对象&#xff0c;用于定义和管理容器化应用程序的部署和更新。Deployment 提供了一种声明性的方式来定义应用程序的期望状态&#xff0c;并负责确保所需数量的 Pod…