Netflix推出服务级别优先负载削减以提高弹性

Netflix 扩展了优先级负载削减策略至单个服务级别

Netflix 为了进一步提升系统的弹性,将优先级负载削减(Prioritized Load Shedding)策略扩展到了单个服务级别。这一策略通过在必要时削减低优先级请求,更高效地利用云资源,而不是通过维护独立集群来实现故障隔离。

背景与之前的策略

Netflix 此前在 API 网关级别部署了负载削减策略,但决定让服务拥有者在服务级别实现其优先级逻辑,重点关注视频流的控制平面和数据平面。Netflix 将 API 请求根据其关键性分为两类:用户发起的请求被视为关键请求,因为这些请求未处理会影响用户体验;而浏览器或应用程序预取的请求被视为非关键请求,即使被丢弃也不会对用户体验产生太大影响。

之前的解决方案无法区分用户发起的请求和预取请求,在大流量峰值时会同时降低两者的可用性。Netflix 曾考虑将不同类别的请求分离到不同的集群中,但由于计算成本较高且增加了运维负担,最终放弃了这一方案。

新的解决方案:并发限制器

Netflix 在 Play API 中实现了一个并发限制器,优先处理用户发起的请求,而非预取请求。该限制器使用开源的 Java 库,并配置为预处理 Servlet 过滤器,通过设备发送的 HTTP 头信息进行优先级判断,而无需解析请求体。

在部署该解决方案几个月后,团队成功观察到其在防止二次故障中的作用。当时,一次基础设施故障导致 Android 设备的预取请求堆积,限制器将预取请求的可用性降低至 20%,而用户发起请求的可用性仍保持在 99.4% 以上。

通用库的创建与扩展

在 Play API 成功应用负载削减后,Netflix 创建了一个通用的内部库,使服务拥有者能够配置多个优先级(关键、降级、尽力而为、批量)。服务可以使用上游客户端的优先级,或将传入请求映射到预配置的优先级之一。

Netflix 的 Staff 软件工程师 Anirudh Mendiratta 解释了该解决方案如何与基于 CPU 的自动扩展协同工作:大多数服务根据 CPU 利用率进行自动扩展,因此 CPU 利用率是系统负载的自然衡量标准。一旦请求被映射到优先级类别,服务可以根据 CPU 利用率决定何时从特定类别中削减流量。为了保持自动扩展的信号,优先级负载削减仅在达到目标 CPU 利用率后开始削减负载,随着系统负载的增加,逐步削减更关键的流量以维护用户体验。

实验与测试

团队进行了一系列实验,通过生成超过自动扩展容量六倍的负载来测试负载削减机制。结果表明,限制器首先削减了非关键请求,随后削减了关键请求,且延迟保持在可接受范围内。

此外,工程师们还将该库扩展到了 IO 密集型服务,增加了基于延迟的削减机制。测试表明,基于延迟的负载削减机制在 CDN 基础设施中的内容源服务上表现良好。

总结

Netflix 通过将优先级负载削减策略扩展至单个服务级别,成功提升了系统的弹性,并更高效地利用了云资源。新的解决方案不仅区分了关键与非关键请求,还通过并发限制器和通用库的创建,进一步优化了系统的负载管理。

阅读 37
0 条评论