优化 Kafka 的生产者和消费者

背景

如今,分布式架构已经成为事实上的架构模范,这使得通过 REST API 和 消息中间件来降低微服务之间的耦合变得必然。就消息中间件而言,Apache Kafka 已经普遍存在于如今的分布式系统中。Apache Kafka 是一个强大的、分布式的、备份的消息服务平台,它主要负责以可扩展性、健壮性和容错性的方式来存储和共享数据。站在应用的角度,应用开发者主要利用 Kafka 生产者和 Kafka 消费者去发布和消费消息。因此生产者和消费者对于优化基于 Kafka 的交互都很重要。

这篇文章主要聚焦于以一种易于理解的的方式去提高 Kafka 的生成者和消费者的性能。性能工程作为一个整体有两个正交的维度:

  1. 吞吐量
  2. 延迟

Kafka 端到端的延迟

Kafka 端到端的延迟是从应用通过 KafkaProducer.send() 发送一个消息开始到应用通过 KafkaConsumer.poll() 消费发布的消息之间的耗时。下面的图清晰的展示了 Kafka 消息经历的各种阶段:

image.png

  1. Produce Time:应用通过 KafkaProducer.send() 发送一个消息到这个消息被发送到主题分区的 leader 之间花费的时间。
  2. Publish Time:Kafka 内部生产者发布批量消息到 Broker 和发布的消息添加到 leader 的 replica log 两个步骤之间的耗时。
  3. Commit Time:Kafak 复制消息到所有的 in-sync replicas(ISR) 所花费的时间
  4. Catch-up Time:一旦消息被提交,如果消费者的偏移量落后于提交的消息 N 条消息,那么,Catch-up Time 就是消费者消费掉这 N 条消息所消耗的时间。
  5. Fetch Time:Kafka 消费者从 leader broker 获取消息花费的时间。

优化方法

一般来说,通过 Kafka 的消息一般会涉及以下参与者:

  1. 生产者
  2. 主题
  3. 消费者

从系统优化的角度来说,我们会专注于生产者和消费者。

优化 Kafka 的生产者

除了 Kafka 消息经历的上述阶段,从优化的角度来看,理解 Kafka Producer 的交付时间分解也同样重要。

image.png

核心配置

  1. batch.size:控制生产者每一批次消息使用的内存大小(单位为 byte),增加 batch size 可能会通过消耗更多的内存来提高吞吐量。
  2. linger.ms:定义了生产者直到一个批量的消息已经凑齐并可以发送到 Broker 等待的时间(单位为毫秒)。增加这个值可以减少网络 IO 并保证更高的吞吐量。然而,更大的值会增加生产者发送消息的延迟。
  3. max.inflight.requests.per.connection:控制了当生产者没有收到响应时,生产者可以发送的批量消息的数量。更高的值可以提交吞吐量,但是会消耗更高的内存。

优化 Kafka 的消费者

  1. fetch.min.bytes:定义了消费者打算从 Broker 获取的最小字节数。更小的值会减少延迟,但是会降低吞吐量。
  2. fetch.wait.max.ms:定义了 Broker 在响应收到的来自消费者的 Fetch 请求之前等待的最大时间。更大的值会以增加延迟为代价来减少网络 IO 和提交吞吐量。
  3. max.poll.records:控制了消费者单次请求获取到的最大记录数。减少该值会降低延迟,降低吞吐量。

Kafka-生产者消费者优化坐标

从图像绘制上,我们可以在上面的理解上整理并准备 Kafka 生产者消费者轴,以轻松记住关键配置及其对应用性能的影响。

image.png

结论

本文,我们通过一个消息会经历的各个阶段解释了什么是 Kafka 中的端到端延迟。现在我们清晰的理解了哪些阶段会影响 Kafka 的生产者和消费者的性能。文中也介绍了一些可以帮助生产者和消费者降低延迟和提交吞吐量的核心配置。通过理解这些配置的影响,可以说,这是在高吞吐量和低延迟之间的一种权衡。通过了解应用的性质(即吞吐量 /延迟敏感)和负载,可以通过实验找到适当的平衡。

PS: Apache Kafka 的默认配置更加倾向于低延迟而非高吞吐

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

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

相关文章

matplotlib的配色(随机颜色函数,各种渐变色,彩虹色)

也是画图的时候经常会遇到的问题,什么颜色好看? 先直接上一个配色表: plt官网:List of named colors — Matplotlib 3.8.0.dev898g4f5b5741ce documentation 需要什么颜色传入就行了。 例如我下面画一个柱状图,自己选…

云擎未来,智信天下 | 2023移动云大会来了!

新三年,新征程 2023年作为新三年开局之年 移动云又将以怎样的 全新品牌形象、全新战略规划 向“一流云服务商”战略目标勇毅前行? 答案就在这里: 2023移动云大会,官宣定档! 2023.4.25 - 4.26 苏州金鸡湖国际会…

Android 中的混音器 AudioMixer 实现分析

Android framework 的音频处理模库 libaudioprocessing (位于 frameworks/av/media/libaudioprocessing) 提供了混音器组件 AudioMixer,它主要用在 audioflinger 里,用来将多路音频源数据混音,以方便送进音频设备播放出来。 音频混音操作本身…

8.2 正态总体的参数的检验

学习目标: 如果我要学习正态总数的参数检验,我会按照以下步骤进行学习: 学习正态分布的基本知识:正态分布是统计学中非常重要的概率分布之一,掌握其基本知识包括概率密度函数、期望值、方差、标准差等是非常重要的。 …

最佳实践:Android应用中的网络请求和数据缓存

最佳实践:Android应用中的网络请求和数据缓存 网络请求在Android应用中的重要性 在现代移动应用中,网络请求扮演着重要的角色,涉及到数据的获取、上传、更新等功能。网络请求在Android应用中具有关键地位,对于提供优秀的用户体验和…

IDEA配置MAVEN_OPTS

IDEA配置MAVEN_OPTS​ 解决问题 maven MAVEN_OPTS设置 maven编译优化 maven编译速度慢 maven打包编译很慢 maven多线程编译打包 IDEA Maven配置教程​​测试环境:Win10(64位) i7-7700HQ 16GB​​ 参考文章: ​​ ​JVM参数MetaspaceSize的误解​​ Java HotSpot™ 64-Bit Ser…

数字化转型迫在眉睫!药企如何应用AI技术加速创新?

导语 | 近年来,随着 AI 等技术的发展应用,数字化、智能化日渐成为各行各业转型升级的新兴力量,其与医药产业的融合创新也逐渐成为当前的新趋势,众多医药制造企业蓄势待发,搭乘数字化的快车,驶入高速发展的快…

[计算机图形学]几何:网格处理(前瞻预习/复习回顾)

一、前言 网格的三种处理:网格细分,网格简化,网格正则化,细分会产生更多的三角面片来让模型更加光滑,简化则相反会减少网格的三角面片数量,正则化则会让三角形面更加规则。如上图中最右边两幅图&#xff0…

理解C语言中的空指针和野指针

在C语言中,指针是一个非常重要的概念,可以用于操作变量和数据结构。但是,指针也是很容易出错的地方。其中包括两种可能的错误:空指针和野指针。 空指针 空指针指代无效的地址,表示指针不指向内存中的任何一个合法对象…

浏览器便携化操作方法

直接进入主题 如果我们不想把 Chrome 安装进 C 盘,又或者想测试多配置,那么浏览器的便携化就非常重要了。 浏览器便携化的方法有很多,国内常用的有两种。 1、MyChrome MyChrome 最早由网友“甲壳虫”开发,除了浏览器便携化&a…

camunda如何启动一个流程

在 Camunda 中启动一个流程需要使用 Camunda 提供的 API 或者用户界面进行操作。以下是两种常用的启动流程的方式: 1、通过 Camunda 任务列表启动流程:在 Camunda 任务列表中,可以看到已经部署的流程,并可以点击“Start”按钮&am…

【微服务】6、一篇文章学会使用 SpringCloud 的网关

目录 一、网关作用二、网关的技术实现三、简单使用四、predicates(1) 网关路由可配置的内容(2) 路由断言工厂(Route Predicate Factory) 五、filters(1) GatewayFilter(2) 给全部进入 userservice 的请求添加请求头(3) 全局过滤器 —— GlobalFilter(4) …

如何在矩池云上部署 Carla,模拟自动驾驶

简介 Carla 是一款基于 Python 编写和 UE(虚幻引擎)的开源仿真器,用于模拟自动驾驶车辆在不同场景下的行为和决策。它提供了高度可定制和可扩展的驾驶环境,包括城市、高速公路和农村道路等。Carla 还提供了丰富的 API 和工具&…

LeetCode算法小抄 -- 环检测算法 和 拓扑排序算法

LeetCode算法小抄 -- 环检测算法 和 拓扑排序算法 环检测算法(DFS)[207. 课程表](https://leetcode.cn/problems/course-schedule/) 拓扑排序算法(DFS)[210. 课程表 II](https://leetcode.cn/problems/course-schedule-ii/) 环检测算法(BFS)拓扑排序算法(BFS) ⚠申明&#xff1…

Python Web开发技巧II

Postman安置Cookie 对于大型项目而已,所携带的cookie往往都不止一个,而是一堆,甚至特别特别长,postman文档提供的cookie操作是全局的,但需要一个一个打(折磨),唯一的优点就是作用域…

3.7 曲率

学习目标: 如果我要学习高等数学中的曲率,我会遵循以下步骤: 1.熟悉相关的数学概念:在学习曲率之前,我们需要了解曲线、切线和曲率半径等相关的数学概念。因此,我会复习这些概念,以便更好地理…

Java阶段一Day21

Java阶段一Day21 文章目录 Java阶段一Day21多线程并发原理使用场景创建并启动线程创建线程的方法 进程线程的生命周期获取线程信息的方法 教师总结新单词多线程概念线程:一个顺序的单一的程序执行流程就是一个线程。代码一句一句的有先后顺序的执行。多线程:多个单一顺序执行的…

Nacos 客户端服务注册源码分析-篇二

Nacos 客户端服务注册源码分析-篇二 继续接上回,上回分析到 NacosNamingService 的整个注册的流程,其实是通过 NacosFactory.createNamingService 方法,反射获取 NacosNamingService 接口的实现类 NacosNamingService ,而 NacosN…

【计算方法】正交区域查询---KD-Tree概念

一、说明 kd 树是一种二叉树数据结构,可以用来进行高效的 kNN 计算。kd 树算法偏于复杂,本篇将先介绍以二叉树的形式来记录和索引空间的思路,以便读者更轻松地理解 kd 树。 二、正交区域查找 2.1 定义 对于k维空间的张量数据表格&#xff0…

一键生成元宇宙 AI又杀疯了

人类十几年的进步水平,AI用几个月就能轻易实现。在展示了超强的文本对话能力和一键生图功能后,AI大模型不打算停下,开始挑战搭建3D空间这一更高难度的动作。 这次,Facebook母公司Meta想当一把主导者。几天前,它的首席…
最新文章