Kafka 负载均衡挑战及解决思路

news2024/11/8 15:32:11

本文转载自 Agoda Engineering,介绍了在实际应用中,如何应对 Kafka 负载均衡所遇到的各种挑战,并提出相应的解决思路。本文简要阐述了 Kafka 的并行性机制、常用的分区策略以及在实际操作中遇到的异构硬件、不均匀工作负载等问题。通过深入分析这些挑战,并提供具体的解决方案,本文旨在帮助读者更好地理解和应用 Kafka 的负载均衡技术,从而提高系统的整体性能和稳定性。

以下大部分内容翻译自原文 how-we-solve-load-balancing-challenges-in-apache-kafka,并已获得原作者同意。

思维导图

Kafka 负载均衡解决方案

Kafka 并行性

Kafka 通过分区来实现并行性,如下图所示,生产者(Producer)产生的消息会按照一定的分区策略分配到多个分区(Partition)中,消费组中的每个消费者会分别负责消费其中的若干个分区。

Kafka 分区演示

分区策略:

  • 轮询(Round Robin):默认情况下,Kafka 使用轮询策略将消息均匀地分配到所有分区。
  • 哈希(Key Hashing):如果消息有分区键,Kafka 会对键进行哈希计算,将消息分配到特定的分区。
  • 自定义分区策略:开发者可以实现自定义的分区器(Partitioner)逻辑,以满足特定需求。

如果要使用轮询或者哈希策略来达到“负载均衡”的目的,那么需要满足以下 2 个假设:

  1. 消费者拥有相同的处理能力,
  2. 消息的工作量相等。

然而,在实践中,这些假设往往不成立。

现实挑战

1. 异构硬件

不同代的服务器硬件性能不同,导致处理速率存在差异。例如,使用不同代硬件进行处理的基准显示性能存在显着差异:

不同服务器处理速率差异举例

2. 每条 Kafka 消息的工作负载不均匀

下图显示了在一个时间窗口内到达的 12 条消息。在这里,生产者向该主题中的六个分区中的每一个发布两条消息。因此,每个 worker 消耗来自 2 个分区的数据,这意味着每个 worker 需要处理 4 条消息。

使用循环分区器和循环分配器来分发消息的先前供应系统的演示。每个 worker 都分配有相同数量的消息。

不同的消息可能需要不同的处理步骤集。例如,处理消息可能涉及调用第三方 HTTP 端点,并且不同的响应大小或延迟可能会影响处理速率。此外,对于涉及数据库操作的应用程序,其数据库查询的延迟可能会根据查询参数而波动,从而导致处理速率发生变化。

3. 过度配置问题

由于工作负载和处理效率不同,为了达到系统吞吐量的需求,可能会出现过度配置问题,从而导致资源浪费。

假设我们的高吞吐量和低吞吐量的处理速率分别为 20 msg/s 和 10 msg/s(根据表 1 中的数据进行简化)。使用两个较快的处理器和一个较慢的处理器,我们预计总容量为 20+20+10 = 50 条消息/秒。但是,当保持消息的循环分配时,我们无法达到此容量。下图显示了如果流量持续达到每秒 50 条消息时会发生什么情况。

如果传入流量保持在 50 条消息/秒,则慢速处理器无法处理总体消息 1/3 的负载,从而导致累积延迟。为了避免高延迟,向该系统添加了额外的资源以维持处理。

从这个例子中我们可以看到,我们的处理器服务一次最多只能接受 30 条消息,以防止滞后并确保及时传递更新。

在这种情况下,要实际每秒处理 50 条消息,我们必须总共扩展到 5 台机器,以保证及时处理所有消息。由于这种不适当的分配逻辑(66.7%的过度配置),我们会向该系统过度配置额外的两台机器。

为了每秒处理 50 条消息,我们需要扩展到五台机器以确保及时处理所有消息。由于这种不适当的分配逻辑(66.7% 的过度配置),这会导致向该系统过度配置两台额外的机器。

静态解决方案

1. 在相同的 Pod(机器)上部署

考虑控制服务部署中使用的硬件类型以缓解问题。如果您在虚拟机上部署服务并拥有充足的资源和性能相同的硬件,则此方法是可行的。

然而,由于成本效益和灵活性下降,在私有云环境中通常不建议采用这种策略,主要是因为同时升级所有现有硬件可能具有挑战性。如果它非常适合您的情况,则可以使用Kubernetes 关联性将 Pod 分配给某些类型的节点。

2. 加权负载均衡

如果容量是可预测的并且大部分时间保持静态,则为不同的消费者分配不同的权重可以帮助最大限度地利用可用资源。例如,在为表现较好的消费者赋予更高的权重后,我们可以将更多流量路由给这些消费者。

动态解决方案

虽然我们可以估计消息的容量和工作负载来设计静态规则来确定加权负载平衡策略,但由于以下几个因素,这种方法在实际生产环境中可能并不总是可行:

  • 消息的工作负载并不统一,这使得估计机器容量变得困难。
  • 依赖关系(例如网络和第三方连接)不稳定,有时会导致实际处理中的容量发生变化。
  • 该系统经常添加新功能,增加额外的维护工作以保持权重更新。

为了解决这些问题,我们可以动态监控每个分区中的当前滞后并根据当前流量状况做出相应响应。

有 2 种思路:

  1. 生产者角度:使用自定义算法根据滞后的消息数量来确定每个分区的流量,这种生产者称为滞后感知生产者(Lag-aware Producer)。
  2. 消费者角度:这些消费者旨在监控当前滞后的消息数量,并可以在必要时取消订阅以触发负载重新平衡。通常,可以采用自定义的重新平衡策略来调整分区分配。这种消费者称为滞后感知消费者(Lag-aware Comsumer)。

1. 从生产者角度出发

如此图所示,生产者可以使用自定义算法根据滞后确定每个分区的流量。为了减少对 Kafka 代理的调用次数,系统可以维护一个内部延迟缓存,而不是在发布每条消息之前调用 Kafka 代理。

在此示例中,分区 4 和 6 的延迟比其他分区高得多。应减少从内部生产者发送到这些分区的流量。

使用滞后数据,定制的算法被设计为向经历高滞后的分区发布更少的流量,向低滞后的分区发布更多流量,以平衡每个分区上的工作负载。当滞后平衡且稳定时,此方法应确保消息的均匀分布。

不适用情况:

  1. 纯消费者应用程序:您的应用程序不控制消息生成。
  2. **多个消费者组:**当生成的消息被多个消费者组消费时,生产者可能会为其他消费者组产生不必要的倾斜负载,因为滞后只是特定于一个消费者组的信息。

相同队列长度算法

该算法将每个分区滞后视为处理的队列大小。获取滞后信息后,它会发布适当数量的消息以填充短队列。此方法更适合由于异构硬件而导致的倾斜滞后分布,其中高性能 Pod(机器)在大多数情况下能够更快地处理。

相同队列长度算法的演示。最初,不同队列的长度不同。该算法尝试生成不同数量的消息,以在所有队列中实现相同的队列长度。这里,队列长度和 Kafka lag 是同一个概念,代表尚未处理的消息数量

异常值检测算法

该算法利用统计方法来确定所有分区的上离群值,并暂时停止那些慢速离群值的发布过程。在原文章中,针对 Agoda 的特定需求,他们提出了 IQR(四分位距)和 STD(标准差)异常值检测算法。算法流程图如下所示。

异常值检查算法流程

  • 慢速分区:(已关闭)由于存在延迟,这些分区的消息生成已停止。
  • 好的分区:(打开)照常发布并均匀分发到所有好的分区。
  • OK 分区:(观察/半开放)为了提高性能不佳的机器的性能,当系统尝试将慢速分区提升为良好分区时,会添加一个观察期。通过仅生成一小部分消息并进行观察,可以将该观察阶段优化为“半开放”状态。当滞后获取间隔相对较长时,半开放是有益的,因为它可以防止消费者延迟等待传入消息而更新的滞后数据尚未查询的情况。

2. 从消费者角度出发

这里 Adoga 提出的思路是:遇到高延迟的实例可以主动取消订阅主题以触发重新平衡。在重新平衡期间,可以使用自定义的分配器来平衡所有消费者实例之间的分区。

触发重新平衡的成本非常昂贵,因为急切的重新平衡会停止消费者组中的所有处理。Kafka 2.4中引入的增量协作再平衡协议已经最大限度地减少了性能影响,允许更频繁的再平衡以更好地分配每个分区上的负载。

为了增强重新分配的灵活性,分区的数量应该大于 worker 的数量。这一比率应根据应用程序而有所不同,并假设一个工作线程至少可以处理来自一个分区的负载以避免饥饿。

在此示例中,工作程序 3 在速度较慢的硬件上运行,导致分区 5 和 6 出现更高的延迟。因此,工作程序 3 可能会主动取消订阅主题以触发重新平衡并更有效地重新分配分区。在此示例中,应实现自定义分配器以根据机器指标和滞后信息重新分配分区。

总结

本文从 Kafka 并行性的一般实现出发,探讨了 Kafka 实现负载均衡在现实实践中可能遇到的各种挑战,并从静态调整和动态调整两个方面给出了解决思路,特别注重讨论了动态调整策略,并分别从生产者和消费者的角度提出了解决方案。

总之,通过在 Kafka 中实现负载均衡,可以有效地将工作负载分配到可用资源之间,从而显著提高服务性能。具体的算法和策略需要根据实际情况进行选择和调整。

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

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

相关文章

ubuntu20.04设置共享文件夹

ubuntu20.04设置共享文件夹 一,简介二,操作步骤1,设置Windows下的共享目录2,挂载共享文件夹3,测试是否挂载成功 一,简介 在公司电脑上,使用samba设置共享文件夹,IT安全部门权限不通…

sql:group by和聚合函数的使用

提示:本文只讲解group by的简单使用和group by和聚合函数组合使用 文章目录 常用聚合函数group by明天继续更新 常用聚合函数 1.MAX:返回某列的最大值 2.MIN(column) 返回某列的最高值 3.COUNT(column) 返回某列的总行数 4.COUNT(*) 返回表的总行数 5.S…

Linux指令(3)

目录 1.上节复习 2.man指令 3.echo指令 4.cp指令 5.mv指令 6.重新认识 7.和文件相关的指令的辨析 8.三大重定向 9.cat指令 10.more命令和less命令 1.上节复习 (1)我们上次学习了这个和文件的删除以及文件夹的删除的相关的指令,rm …

【网络架构】Nginx

目录 一、I/O模型 1.1 Linux 的 I/O 1.2 零拷贝技术 1.3 网络IO模型 1.3.1 阻塞型 I/O 模型(blocking IO)​编辑 1.3.2非阻塞型 I/O 模型 (nonblocking IO)​编辑 1.3.3 多路复用 I/O 型 ( I/O multiplexing )​编辑 1.3.4 信号驱动式 I/O 模型 …

React-配置json-server

安装json-server:json-server工具准备后端接口服务环境_jsonserver临时后端-CSDN博客 在package.json文件中的scripts添加: "serve":"json-server json文件路径 --port 端口号" 在终端输入命令npm run serve,就可以启动…

Redis高级特性和应用:慢查询、Pipeline、事务、Lua

Redis提供了许多高级特性,可以帮助优化和管理系统性能。本文将介绍Redis的慢查询、Pipeline、事务和Lua脚本的使用及其相关配置。 Redis的慢查询 慢查询日志是开发和运维人员定位系统慢操作的重要工具。Redis也提供了类似的功能,通过记录超过预设阀值的…

Topaz Photo AI:Mac上的智能降噪专家,让每一张照片都清晰如初

Topaz Photo AI for Mac 是一款专为Mac用户打造的人工智能降噪软件,它在图像处理领域展现了出色的性能和创新。以下是关于这款插件的详细介绍: 一、卓越的降噪效果 Topaz Photo AI利用深度学习技术和复杂的机器学习算法,能够自动检测并修复…

蓝牙BLE上位机工具开发理论线索梳理_5.Windows WinRT API包Microsoft.Windows.SDK.Contracts

1. WinRT API包介绍 本文介绍下Windows WinRT API包(Microsoft.Windows.SDK.Contracts), 如图1是SDK包的描述。 图1 Microsoft.Windows.SDK.Contracts Windows WinRT API包使您能够将最新的Windows运行时API支持添加到您的。net Framework 4.…

盘点|AI大模型时代,2024医疗器械网络安全应对与挑战(上)

6月5日,以“AI驱动安全”为主题,2024全球数字经济大会数字安全高层论坛,暨北京网络安全大会战略峰会在北京国家会议中心开幕。 与会专家指出,攻击者可利用人工智能技术生成网络攻击和网络钓鱼工具,网络安全从人人对抗、…

Vue2+Element-ui后台系统常用js方法

el-dialog弹框关闭清空form表单并清空验证 cancelDialog(diaLog, formRef) {this[diaLog] falseif (formRef) {this.$refs[formRef].resetFields()} }页面使用&#xff1a; <el-dialog :visible.sync"addSubsidyDialog.dialog" close"cancelDialog(addSub…

easyexcel的简单使用(execl模板导出)

模板支持功能点 支持列表支持自定义头名称支持自定义fileName支持汇总 模板示例 操作 pom引入 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version></dep…

java基础知识漏洞记录一

下面是我在阅读JavaGuide面试资料时遇到的不熟悉的知识点总结 JDK9中JRE与JDK新关系 从 JDK 9 开始&#xff0c;就不需要区分 JDK 和 JRE 的关系了&#xff0c;取而代之的是模块系统&#xff08;JDK 被重新组织成 94 个模块&#xff09; jlink 工具 (随 Java 9 一起发布的新命…

Ubuntu下使用`sysbench`来测试CPU性能

使用 sysbench 来测试 CPU 性能是一个常见的方法。sysbench 是一个模块化的跨平台基准测试工具&#xff0c;常用于评估系统的各个组件&#xff08;例如 CPU、内存、I/O 子系统等&#xff09;的性能。 下面是如何使用 sysbench 来测试 CPU 性能的基本步骤&#xff1a; 1. 安装…

【乐吾乐2D可视化组态编辑器】导出HTML,下载离线部署包

乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 使用步骤 1. 从“文件”菜单导出HTML 导出为 HTML 需要一定的开发能力&#xff0c;后续不再维护&#xff0c;即将下线&#xff0c;推荐使用 下载离线部署包&#xff08;html&#xff09; 2. 解压 3. 下载后端…

如何将ai集成到radsystems项目中,在项目中引入ai

AI可以自动化重复性和低价值的任务&#xff0c;例如数据输入、文档处理、信息检索等&#xff0c;让员工能够专注于更具战略性和创造性的工作。通过引入AI驱动的聊天机器人或虚拟助手&#xff0c;可以提供24/7的客户支持&#xff0c;快速响应用户的问题&#xff0c;提高客户满意…

Java——重载

一、重载&#xff08;Overload&#xff09; 1、重载是什么 方法重载&#xff08;Method Overloading&#xff09;是Java中实现多态的一种方式。它允许在同一个类中定义多个同名的方法&#xff0c;只要这些方法的参数列表不同。这些不同的参数列表可以通过不同的参数类型、参数…

从零到一,四步战略解锁AI产品经理大门

前言 在当今科技飞速发展的背景下&#xff0c;越来越多的职场人士将目光投向了人工智能&#xff08;AI&#xff09;领域&#xff0c;寻求职业发展的新机遇。其中&#xff0c;AI产品经理和技术工程师作为该领域的两大明星岗位&#xff0c;凭借其高薪和广阔的职业发展前景&#…

深入解析TF-IDF算法:文本分析的基石与力量

在信息爆炸的时代文本数据无处不在&#xff0c;从新闻报道到社交媒体帖子&#xff0c;从学术论文到产品评论&#xff0c;大量的文本信息需要被有效地分析和利用。在这样的背景下TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;算法作为一种简单而有效…

LabVIEW输送机动态特性参数监测系统

开发了一套基于LabVIEW软件和STM32F103ZET6单片机的带式输送机动态特性参数监测系统。该系统通过电阻应变式压力传感器和光电编码器实时采集输送带的张力和带速信息&#xff0c;通过5G模块将数据传输至上位机&#xff0c;实现数据的可视化处理与实时预警&#xff0c;有效提高输…

vue3+vite:动态引入静态图片资源

目录 第一章 前言 第二章 vue2与vue3动态引入静态图片资源 2.1 vue2 webpack动态引入静态图片资源 2.1.1 了解 2.1.2 vue2项目动态引入静态图片资源 2.2 vue3 vite动态引入静态图片资源 2.2.1 了解 2.2.2 require vs import了解 2.2.3 vue3vite 项目动态引入静态图片…