Uber通过自适应负载削减提升微服务弹性

Uber 推出新的负载均衡库 Cinnamon

Uber 为其微服务平台开发了一个新的负载均衡库 Cinnamon,该平台服务于超过 1.3 亿客户,并处理每秒数百万次请求(RPS)的峰值。Cinnamon 替代了基于 QALM(QoS Aware Load Management)的解决方案,不仅能实现优雅降级,还能动态、持续地调整服务容量和负载均衡量。

背景与需求

Uber 需要一个在平台出现性能问题时能够优雅降级的解决方案。此前,Uber 开发了 QALM 框架,该框架能够在流量过载、资源耗尽或依赖项故障时,优先处理关键请求并丢弃非关键请求,以避免或减轻服务中断。虽然 QALM 表现良好,但需要针对特定用例仔细调整配置参数。

Uber 的首席工程师 Jakob Holdgaard Thomsen 解释了无配置负载均衡的重要性:鉴于 Uber 的服务规模,任何优雅降级解决方案都必须是自动的且无需配置,因为即使每个服务只需要一个配置值,考虑到 Uber 运营的大量服务以及这些值容易过时,手动配置将耗费大量工程时间。

Cinnamon 的技术实现

Cinnamon 使用了改进的 TCP-Vegas 算法来调整服务容量,并通过 PID(比例-积分-微分)控制器基于传入请求应用负载均衡率。Cinnamon 被构建为 RPC 中间件,可以轻松被 Uber 开发的服务导入。该库依赖于通过 Jaeger 从边缘传播的请求上下文中的优先级标签。Uber 使用了一种受微信启发的方案,其中优先级值由层级组件(0 为最高,5 为最低)和用户群体组件组成,将用户分为 128 个桶。

Cinnamon 的架构与工作流程

每个由 Cinnamon 处理的请求在发送到服务业务逻辑之前,都会经过一系列内部组件。Rejector 决定是否接受请求,Priority Queue 根据优先级对接受的请求进行排序,Scheduler 负责并行处理并强制执行速率限制。

此外,两个后台进程持续调整拒绝阈值和并行度。当 Rejection 组件检测到过载时,PID 控制器进程会启动,监控进入 Priority Queue 的请求流入和流出。PID 控制器能够快速找到稳定的请求丢弃比例,并且与服务的吞吐量无关。Auto-tuner 后台进程使用定制的 Vegas TCP/IP 控制算法,监控服务延迟并调整 Scheduler 使用的并行度,以实现最佳的吞吐量与延迟平衡。

性能测试与结果

Uber 团队对 Cinnamon 进行了广泛的性能测试,并将其与 QALM 进行了比较。结果显示,Cinnamon 非常高效,平均仅增加一毫秒的请求延迟。新库能够处理更大的过载,同时保持可接受的延迟,并且正在被 Uber 的服务团队迅速采用。

相关报道

InfoQ 此前报道了 Monzo 的定向流量均衡解决方案。

阅读 37
0 条评论