Kafka 为什么那么快?

news/2024/5/13 5:58:51/文章来源:https://blog.csdn.net/jcc4261/article/details/128230893

有人说:他曾在一台配置较好的机子上对 Kafka 进行性能压测,压测结果是 Kafka 单个节点的极限处理能力接近每秒 2000万 条消息,吞吐量达到每秒 600MB

那 Kafka 为什么这么快?如何做到这个高的性能?

本篇文章主要从这 3 个角度来分析:

  • 生产端
  • 服务端 Broker
  • 消费端

     

 

先来看下生产端发送消息,Kafka 做了哪些优化?

(1)生产端 Producer

 

先来回顾下 Producer 生产者发送消息的流程:

  1. 首先指定消息发送到哪个 Topic

  2. 选择一个 Topic 的分区 partitiion,默认是轮询来负载均衡。

    也可以指定一个分区 key,根据 key 的 hash 值来分发到指定的分区。

    也可以自定义 partition 来实现分区策略。

  3. 找到这个分区的 leader partition

  4. 与所在机器的 Broker 的 socket 建立通信。

  5. 发送 Kafka 自定义协议格式的请求(包含携带的消息、批量消息)。

将思绪集中在消息发送时候,可发现这两个华点:批量消息自定义协议格式

  1. 批量发送:减少了与服务端 Broker 处理请求的次数,从而提升总体的处理能力。

    调用 send() 方法时,不会立刻把消息发送出去,而是缓存起来,选择恰当时机把缓存里的消息划分成一批数据,按批次发送给服务端 Broker

  2. 自定义协议格式:序列化方式和压缩格式都能减少数据体积,从而节省网络资源消耗。

各种压缩算法对比:

  • 吞吐量方面:LZ4 > Snappy > zstd 和 GZIP
  • 压缩比方面:zstd > LZ4 > GZIP > Snappy

 

(2)服务端 Broker

Broker 的高性能主要从这 3 个方面体现:

  1. PageCache 缓存
  2. Kafka 的文件布局 以及 磁盘文件顺序写入
  3. 零拷贝 sendfile:加速消费流程

下面展开讲讲。

1)PageCache 加速消息读写

使用 PageCache 主要能带来如下好处:

  1. 写入文件的时候:操作系统会先把数据写入到内存中的 PageCache,然后再一批一批地写到磁盘上,从而减少磁盘 IO 开销。

  1. 读取文件的时候:也是从 PageCache 中来读取数据。

    如果消息刚刚写入到服务端就会被消费,按照 LRU 的“优先清除最近最少使用的页”这种策略,读取的时候,对于这种刚刚写入的 PageCache,命中的几率会非常高。

2)Kafka 的文件布局 以及 磁盘文件顺序写入

文件布局如下图所示:

主要特征是:文件的组织方式是“topic + 分区”,每一个 topic 可以创建多个分区,每一个分区包含单独的文件夹。

Kafka 在分区级别实现文件顺序写:即多个文件同时写入,更能发挥磁盘 IO 的性能。

  • 相对比 RocketMQ RocketMQ 在消息写入时追求极致的顺序写,所有的消息不分主题一律顺序写入 commitlog 文件, topic 和 分区数量的增加不会影响写入顺序。

  • 弊端: Kafka 在消息写入时的 IO 性能,会随着 topic 、分区数量的增长先上升,后下降。

    所以使用 Kafka 时,要警惕 Topic 和 分区数量。

3)零拷贝 sendfile:加速消费流程

当不使用零拷贝技术读取数据时:

流程如下:

  1. 消费端 Consumer:向 Kafka Broker 请求拉取消息

  2. Kafka Broker 从 OS Cache 读取消息到 应用程序的内存空间:

    1. 若 OS Cache 中有消息,则直接读取
    2. 若 OS Cache 中无消息,则从磁盘里读取
  3. 再通过网卡,socket 将数据发送给 消费端Consumer

当使用零拷贝技术读取数据:

Kafka 使用零拷贝技术可以把这个复制次数减少一次,直接从 PageCache 中把数据复制到 Socket 缓冲区中。

  • 这样不用将数据复制到用户内存空间。
  • DMA 控制器直接完成数据复制,不需要 CPU 参与,速度更快。

(3)消费端 Consumer

消费者只从 Leader分区批量拉取消息。

为了提高消费速度,多个消费者并行消费比不可少。 Kafka 允许创建消费组(唯一标识 group.id),在同一个消费组的消费者共同消费数据。

举个栗子:

  • 有两个 Kafka Broker,即有 2个机子
  • 有一个主题:TOPICA,有 3 个分区(0, 1, 2)

如上图,举例 4 中情况:

  1. group.id = 1,有一个消费者:这个消费者要处理所有数据,即 3 个分区的数据。

  2. group.id = 2,有两个消费者:consumer 1消费者需处理 2个分区的数据,consumer2 消费者需处理 1个分区的数据

  3. group.id = 3,有三个消费者:消费者数量与分区数量相等,刚好每个消费者处理一个分区

  4. group.id = 4,有四个消费者:消费者数量 > 分区数量,第四个消费者则会处于空闲状态

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试官:MySQL 中 varchar(n) 中 n 最大取值为多少?

前置知识 要回答这个问题,首先我们得先知道 MySQL 存储一条记录的格式长什么样子。 以 Compact 行格式作为例子,它长这样: 可以看到,一条完整的记录分为「记录的额外信息」和「记录的真实数据」两个部分。 这里重点讲讲记录的…

安卓APP源码和设计报告——健身系统

一、设计背景 1.需求分析 对于很多人来说拥有一副好身材能让自己增添不少魅力;对于爱吃而又担心自己发胖的人来说适当的运动健身是最好的选择。移动互联网时代,市场上“约跑”“约健身”健身APP软件成为新时代闺蜜朋友的互动模式,健身热潮的来临&#…

MySQL分区详解

目录 一、定义 1.1 概述 1.2 分区的优势 二、分区的类型 2.1 检查MySQL是否支持分区 2.2 类型 2.3 分区的其他操作 一、定义 1.1 概述 数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写…

第17章 事件和概率空间

第17章 事件和概率空间 17.1 做个交易吧 假设你有三扇门可供选择。其中一扇门背后是一辆汽车,另外两扇门背后是一只山羊。你选择了一扇门,比如1号门。然后知道门后面有什么的主持人,开启了另一扇后面有山羊的门,假设是3号门。现…

The reference to entity “useSSL“ must end with the ‘;‘ delimiter.

The reference to entity "useSSL" must end with the ; delimiter.& 替换为 &amp; < 替换为 < > 替换为 > " 替换为 &quot;替换为 &apos; jdbc:mysql://127.0.0.1:3306/dbname?characterEncodingutf8&amp;useSSLfalse&am…

Redis vs MongoDB

Redis vs MongoDB 通常情况下&#xff0c;应用系统的技术选型&#xff0c;对于如何选择非关系型数据库&#xff0c;是一个不小的挑战。这不仅考验架构师在技术上的广度和深度&#xff0c;同时也考究对业务细节了解和熟悉程度。只有将业务场景、业务特点、数据特征跟具体的技术…

Qt 多线程之QtConcurrent::map(处理序列容器)

QtConcurrent::map()、QtConcurrent::mapped() 和 QtConcurrent::mappedReduced() 函数对一个序列中&#xff08;例如&#xff1a;QList、QVector&#xff09;的项目并行地进行计算。 1、map函数 map函数的功能是在其他线程运行指定的函数&#xff0c;map函数有两个参数 第一…

玩好.NET高级调试,你也要会写点汇编

一&#xff1a;背景 1. 简介 .NET 高级调试要想玩的好&#xff0c;看懂汇编是基本功&#xff0c;但看懂汇编和能写点汇编又完全是两回事&#xff0c;所以有时候看的多&#xff0c;总手痒痒想写一点&#xff0c;在 Windows 平台上搭建汇编环境不是那么容易&#xff0c;大多还是…

web课程设计:HTML非遗文化网页设计题材【京剧文化】HTML+CSS+JavaScript

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

提高技术质量标准 | Google Play 持续打造优质平台

作者 / Google Play 统筹产品经理 Lauren Mytton在上一篇文章中&#xff0c;我们为大家总结了 Google Play 在近期将要推出多项新功能&#xff0c;接下来我们将会陆续展开逐一详细说明。应用质量是我们在 Google Play 所做一切努力的基础。Android 用户希望从他们下载的应用和游…

kubernetes 1.18 部署 ingress-nginx

文章目录kubernetes 1.18 部署 ingress-nginx1. 下载 yaml 文件2. 安装 ingress-nginx3. 检查安装情况4. 测试验证4.1 查看ingress规则4.2 访问测试5. 其他内容kubernetes 1.18 部署 ingress-nginx 1. 下载 yaml 文件 在 GitHub 下载完成之后可以直接使用&#xff0c;不需要修…

Linux 部署主从DNS服务器

几个概念&#xff1a; 域名解析为IP地址&#xff1a;正向解析 IP地址解析为域名&#xff1a;反向解析 主DNS服务器&#xff1a;在特定区域内具有唯一性&#xff0c;负责维护该区域内的域名和IP地址之间的对应关系。 从DNS服务器&#xff1a;从服务器中获得域名和IP地址对应关系…

Android桌面图标快捷方式

一、背景 长按桌面图标实现快捷方式最早是iOS提供的功能,而Android最早在Android 7.1版本也提供了对这方面的支持,于是在短时间内,像微信,支付宝,头条等流量级应用都提供了这方面的支持,如下图。 现在,长按桌面图标快捷方式已经是很成熟的功能,实现上也比较简单,主…

爆火的OpenAi的ChatGPT聊天机器人注册和使用攻略

先来看看他的效果怎木样: 哇塞!是不是很奈斯!!! 一. 对OpenAi进行注册登录(需要翻墙) OpenAI APIAn API for accessing new AI models developed by OpenAIhttps://beta.openai.com/ 二. 购买一个虚拟号码用于手机号注册 nullReceive sms online on virtual numbers of SMS…

五、卷积神经网络CNN5(图像卷积与反卷积)

图像卷积 首先给出一个输入输出结果那他是怎样计算的呢&#xff1f; 卷积的时候需要对卷积核进行 180 的旋转&#xff0c;同时卷积核中心与需计算的图像像素对齐&#xff0c;输出结构为中心对齐像素的一个新的像素值&#xff0c;计算例子如下&#xff1a;这样计算出左上角(即第…

[附源码]Python计算机毕业设计Django智能衣橱APP

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

一次nginx “time out”故障排查

研发请求协助排查一个nginx故障。 描述如下&#xff1a; 在内部环境测试没问题。 打包到生产环境后&#xff0c;访问nginx接口地址超时。 研发比对后怀疑是nginx版本不一致导致。内部版本1.23.2&#xff0c;生产环境1.23.1. 收到信息第一感觉不是nginx的问题。不过先测试一…

-aop-

文章目录一.动态代理实现invocationHandler二.AOP概述环绕通知Pointcut定义切入点一.动态代理实现invocationHandler 动态代理&#xff1a;可以在程序的执行过程中&#xff0c;创建代理对象。 通过代理对象执行方法&#xff0c;给目标类的方法增加额外的功能&#xff08;功能增…

华硕编程竞赛11月JAVA专场 A题自由弹簧 题解

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲…

Android 中的广播机制

一、Android广播概念&#xff1a; 在Android中&#xff0c;有一些操作完成以后&#xff0c;会发送广播&#xff0c;Android系统内部产生这些事件后广播这些事件&#xff0c;至于广播接收对象是否关心这些事件&#xff0c;以及它们如何处理这些事件&#xff0c;都由广播接收对象…