Kafka负载均衡挑战解决

本文为 How We Solve Load Balancing Challenges in Apache Kafka 阅读笔记

kafka通过利用分区来在多个队列中分配消息来实现并行性。然而每条消息都有不同的处理负载,也具有不同的消费速率,这样就有可能负载不均衡,从而使得瓶颈、延迟问题和整体系统不稳定,进而导致额外的维护工作或额外的资源分配。

在 Kafka 中,分区器和分配器策略会影响消息分发。

Producer 分区器

  • Round-robin:平均分配消息至各分区。
  • Sticky partitioning:短时间内固定分配到一个分区,减少 rebalance 影响。

Consumer 分配器

  • Range、Round-robin:静态分配分区给消费者。

这些策略都是基于两个主要的假设

  • 消费者具有相同的处理能力
  • 消息的工作量都相等

挑战

异构硬件

不同的服务器硬件代次的性能不同,从而导致处理速率不同。

消息工作负载不均衡

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

过度配置

在资源分配过程中,系统为应对预期峰值负载而分配了远超实际需求的资源,导致资源利用率低下和成本浪费

假设我们的高吞吐量和低吞吐量的处理速率分别为 20 msg/s 和 10 msg/s(根据表 1 中的数据简化)。使用两个较快的处理器和一个较慢的处理器,我们预计总容量为 20+20+10 = 50 条消息/秒。

在这里插入图片描述

但由于轮询均匀分配消息(每台处理器分到约16.67 msg/s),低速处理器无法处理其份额,实际系统仅能处理30 msg/s(10×3),剩余消息堆积,引发延迟。

静态平衡方案

相同pod上部署

可以考虑控制服务部署中使用的硬件类型以缓解问题。

加权负载均衡

如果容量是可预测的,并且大部分时间保持不变,则为不同的使用者分配不同的权重有助于最大限度地利用可用资源。例如,在为性能更好的使用者提供更高的权重后,我们还可以将更多流量路由到这些使用者。

响应式延迟感应

虽然是可以估算负载来通过加权方式来进行负载均衡,然而

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

为了解决这些问题,我们在系统中实施了延迟感知机制,以动态监控每个分区中的当前延迟,并根据当前流量状况做出相应的响应。

  • Log-aware Producer: 利用动态分区逻辑来考虑目标主题的滞后信息
  • Log-aware Consumer: 监控当前的滞后,并在必要时自行取消订阅以触发负载的重新平衡。通常,可以采用自定义再平衡策略来调整分区分配。

在这里插入图片描述

Log-aware Producer

以下是不应该使用的情况下

  • 纯消费类应用 :您的应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值