本文为 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
以下是不应该使用的情况下
- 纯消费类应用 :您的应用

最低0.47元/天 解锁文章
377

被折叠的 条评论
为什么被折叠?



