奈飞(Netflix)将其优先级负载削减实施扩展到了单个服务级别,进一步提高了系统弹性。该方法通过仅在必要时释放低优先级的请求,而无需维护单独的集群进行故障隔离,从而更有效地利用了云容量。
该公司之前在 API 网关级别部署了负载削减策略,但最终决定使服务所有者能够在服务级别实现其优先级逻辑,重点关注视频流控制平面和数据平面。奈飞(Netflix)根据 API 请求的重要程度将其分为两类。用户发起的请求被认为是至关重要的,因为如果不处理这些请求会影响用户体验。另一方面,浏览器或应用程序预测用户意图而发出的预取请求被认为是不那么重要的,可以丢弃,并且不会对用户体验产生太大的影响。
之前的解决方案并没有区分是用户发起的请求还是预取请求,在流量激增的情况下,这两种请求的可用性都会降低。奈飞(Netflix)曾考虑将不同的请求类别分到单独的集群,但由于较高的计算成本和额外的运营开销,决定不采用这种方法。
具有优先级负载削减的单集群
相反,该公司在其 Play API 中实施了并发限制器,使用开源的 Java 库将用户发起的请求优先于预取请求。限制器被配置为预处理 Servlet 过滤器,使用设备发送的 HTTP 头,而无需解析请求体。
在部署更改几个月之后,一次基础设施的中断导致了安卓设备的预取请求堆积如山,负责该解决方案的团队观察到了他们在防止二次中断方面所做的努力。限制器将预取请求的可用性降至 20%,而用户初始化请求的可用率仍然很高,超过 99.4%。
预取和用户初始化请求的可用性
在推出 Play API 的负载削减后,该团队创建了一个通用的内部库,使服务所有者能够使用多个优先级(关键、降级、最佳、批量)级别来配置优先级逻辑。服务可以使用上游客户端的优先级,也可以将传入请求映射到预配置的某个优先级级别上。
奈飞(Netflix)的资深软件工程师、博客文章的合著者 Anirudh Mendiratta 解释了服务级负载削减解决方案是如何配合基于 CPU 的自动伸缩一起工作的:
奈飞(Netflix)的大多数服务都会根据 CPU 利用率自动伸缩,因此将其与优先级负载削减框架结合起来是一种自然的系统负载度量标准。一旦请求被映射到优先级桶中,服务就可以根据 CPU 利用率确定何时从特定桶中削减流量。为了保持向自动伸缩发出所需要的伸缩信号,优先级削减仅在达到目标 CPU 利用率后才开始削减负载,并且随着系统负载的增加,将逐步削减更多关键流量,以保持用户体验。
该团队进行了一系列实验,通过生成超过自动缩放量六倍的负载配置文件来测试负载削减。正如预期的那样,限制器首先丢弃了非关键请求,然后关键请求和延迟仍保持在可接受的范围内。
基于 CPU 的负载削减行为
此外,工程师还通过添加基于延迟的削减,扩展了库,使其适用于 IO 绑定的服务。基于延迟度量的 IO 绑定工作负载的削减行为在已与 CDN 基础设施一起使用的内容源服务上成功地进行了测试。
原文链接:
评论