Allegro 在 Hermes 中实现动态工作负载平衡
Allegro 是波兰最大的电子商务平台,近期在其开源的发布-订阅消息代理 Hermes 中实现了动态工作负载平衡。Hermes 基于 Apache Kafka 构建,旨在支持 Allegro 数百个多语言微服务的消息传递需求。新的工作负载平衡算法在异构硬件上实现了更均匀的资源利用和更低的基础设施成本。
Hermes 架构与功能
Hermes 的架构包括以下几个关键组件:
- Hermes Frontend:通过 REST 接口发布消息。
- Apache Kafka:内部存储消息。
- Hermes Consumers:从 Kafka 消费消息,提供重试、背压和速率限制等可靠性保障。
Hermes Consumers 组件允许配置订阅服务及其 HTTP 端点,确保消息从 Kafka 主题分区传递到可配置数量的消费者实例。Hermes 还管理 Kafka 消费者组订阅,确保消息的可靠传递。
初始工作负载平衡器的问题
Hermes 的初始工作负载平衡器设计旨在为每个消费者分配相同数量的订阅。然而,由于订阅的负载不均衡,导致 CPU 使用率在不同消费者实例之间分布不均。为了应对流量波动,团队不得不以最高利用率进行扩展,导致许多实例未充分利用,浪费资源并增加成本。
改进工作负载平衡算法
为了改进工作负载平衡算法,团队在保留原有平衡器核心职责的基础上,引入了以下改进:
- 加权与稳定化延迟:使用指数加权移动平均(EWMA)平滑流量波动。
- 控制理论应用:引入比例控制器概念,逐步调整变更并评估系统效果。
通过反馈机制,团队最终实现了在异构硬件上均匀分配订阅-消费者权重,从而达到 CPU 使用率的均衡。
成果与影响
改进后的算法显著减少了 CPU 使用率的差异,优化了资源利用,降低了基础设施成本。这一改进不仅提高了系统性能,还为 Allegro 的电子商务平台提供了更可靠和高效的消息传递解决方案。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。