优化 Kafka 的生产者和消费者

news2024/12/27 10:16:50

背景

如今,分布式架构已经成为事实上的架构模范,这使得通过 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.coloradmin.cn/o/417993.html

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

相关文章

HBase高手之路5—HBase的JavaAPI编程

文章目录Hbase高手之路5—Hbase的JavaAPI编程一、需求与数据集二、准备工作1.下载安装Java2.下载安装Idea3.下载安装maven4.Maven配置国内的镜像库5.Idea使用自定义的maven配置6.创建一个maven测试项目7.创建所需要的包8.创建类文件,输入代码9.运行项目三、创建HBas…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现

更新信息:2023-4-15 更新了代码 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 更新信息:2023-4-15 更新了代码 1 题目 在银行信用卡或相关的贷款等业务中,对客户授信之前,需…

Linux程序的内存

要研究程序的运行环境,首先要弄明白程序与内存的关系。程序与内存的关系,好比鱼和水一般密不可分。内存是承载程序运行的介质,也是程序进行各种运算和表达的场所。了解程序如何使用内存,对程序本身的理解,以及后续章节…

【CSS-Part3 样式显示模式、背景设置、三大特性 】

CSS-Part3 样式显示模式、背景设置、三大特性一 CSS元素显示模式:1.1块元素:1.2行内元素:1.3行内块元素:(同时具有行内元素和块元素的特点)元素显示模式总结:1.4元素显示模式转换:一种模式的元素需要另一模…

从Navicat 和 DBeaver中导出数据不要文本识别符号 “”

今天需要从MySQL和ClickHouse数据库中导出CSV数据文件,打开CSV数据文件后发现字段的数据带着""这种不需要的符号,研究了一下终于成功导出了不要文本识别符号“”的CSV文件 一、演示从DBeaver导出ClickHouse数据库的表文件 第一步&#xff0c…

SSH、OpenSSH、SSL、OpenSSL及CA

OpenSSL1. SSH、OpenSSH、SSL、OpenSSL关系及区别2. SSH介绍2.1 概念2.2 SSH的主要功能2.3 示例讲解2.4 ssh和sshd的区别3. OpenSSH介绍3.1 概念3.2 OpenSSH程序简介3.3 OpenSSH 包含的组件1. ssh2. scp3. sftp4. sshd5. ssh-keygen6. ssh-copy-id7. ssh-agent8. ssh-add9. ssh…

刘二大人《Pytorch深度学习实践》第九讲多分类问题

文章目录多分类问题损失函数课上代码transforms的使用方法view()函数dim维度的理解为什么要使用item()多分类问题 把原来只有一个输出,加到10个 每个输出对应一个数字,这样可以得到每个数字对应的概率值,这里每个输出做…

Netty实战与调优

Netty实战与调优 聊天室业务介绍 代码参考 /*** 用户管理接口*/ public interface UserService {/*** 登录* param username 用户名* param password 密码* return 登录成功返回 true, 否则返回 false*/boolean login(String username, String password); }/*** 会话管理接口…

如何快速上手Vue框架?

编译软件:IntelliJ IDEA 2019.2.4 x64 运行环境:Google浏览器 Vue框架版本:Vue.js v2.7.14 目录一. 框架是什么?二. 怎么写一个Vue程序(以IDEA举例)?三. 什么是声明式渲染?3.1 声明式3.2 渲染四…

docker安装oracle_11g -- 命还长时,自己搞的小玩具!!!

前言: 如果不是嫌命长, 建议不这么玩, 因为装到最后你会很崩溃, 感觉毫无意义, 就是个玩具, 哎~~~就是玩!!! 参考文档 1.https://blog.51cto.com/u_12946336/5722259 2.https://www.muzhuangnet.com/show/118178.html 3.https://blog.csdn.net/qq_42957435/article/details/1…

spring security+jwt实现认证和授权

最近正在研究前后端分离的开发模式&#xff0c;做做小项目练练手&#xff0c;正好用到了spring security的认证和授权&#xff0c;就总结一波。 首先&#xff0c;引入相关的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId&g…

支付系统设计:收银台设计一

文章目录前言1. 收银台前端页面1. 1 收银台的业务场景1. 2 同应用不同支付场景下的收银台2. 商户平台配置管理2.1 配置流程2.2 支付工具列表配置2.3 支付配置2.3 支付银行配置3. 系统处理流程3.1 下单流程3.1 拉起收银台流程总结前言 收银台即用户日常付款前选择支付方式的页面…

革新设计,小巧强大,水库保卫无忧!

水库安全运行事关广大人民群众生命财产安全&#xff0c;为规范水库管理&#xff0c;落实水库预报、预警、预演、预案措施&#xff0c;提升水库信息化管理水平&#xff0c;保障水库安全运行。水库大坝是重要的国民基础设施&#xff0c;承担着防洪抗旱&#xff0c;节流发电的重要…

新规拉开中国生成式AI“百团大战”序幕?

AI将走向何方&#xff1f; ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论&#xff0c;AI该如何管理&#xff1f;AI该如何发展&#xff1f;一系列问题都成为人们热议的焦点。此前&#xff0c;马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代&#xf…

SGAT丨单基因分析工具SingleGeneAnalysisTool

Single Gene Analysis Tool 简介&#xff1a;SGAT是一个免费开源的单基因分析工具&#xff0c;基于Linux系统实现自动化批量处理&#xff0c;能够快速准确的完成单基因和表型的关联分析&#xff0c;只需要输入基因型和表型原始数据&#xff0c;即可计算出显著关联的SNP位点&…

学习大数据需要什么语言基础

Python易学&#xff0c;人人都可以掌握&#xff0c;如果零基础入门数据开发行业的小伙伴&#xff0c;可以从Python语言入手。 Python语言简单易懂&#xff0c;适合零基础入门&#xff0c;在编程语言排名上升最快&#xff0c;能完成数据挖掘、机器学习、实时计算在内的各种大数…

测试名词介绍

测试名词介绍一&#xff1a;敏捷测试1. 定义&#xff1a;2. 敏捷测试的核心&#xff1a;3. 敏捷测试的8大原则和传统测试的区别二&#xff1a;测试名词介绍瀑布模型回归测试Alpha测试Beta测试性能测试白盒测试黑盒测试灰盒测试三&#xff1a;测试流程单元测试 (unit test)集成测…

Java RSA加解密算法学习

一、前言 1.1 问题思考 为什么需要加密 / 解密&#xff1f;信息泄露可能造成什么影响&#xff1f; 二、 基础回顾 2.1 加密技术 加密技术是最常用的安全保密手段&#xff0c;利用技术手段把重要的数据变为乱码&#xff08;加密&#xff09;传送&#xff0c;到达目的地后再…

nginx的前端部署方式

1. 什么是nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。 由俄罗斯的程序设计师Igor Sysoev所开发&#xff0c;官方测试nginx能够支支撑5万并发链接&#xff0c; 并且cpu、内存等资源消耗却非常低&#xff0…

javascript 数组详解

1.数组是可变的 数组内元素可以是不同的类型&#xff1a; 字符串一旦创建就不可变&#xff0c;但数组是可变的&#xff0c;且操作起来十分随意&#xff0c;例如&#xff1a; 直接修改数组长度&#xff0c;若新赋予长度小于原数组长度&#xff0c;会直接舍弃多余元素: 若新赋予…