限流模式
控制应用程序,个人租户或整个服务的实例的资源消耗。这可以使系统继续运行并符合SLA(服务水平协议),即使需求增加对资源造成极大的负担。
背景和问题
云应用程序的负载通常随时间而变化,这取决于活跃用户的数量或者正在执行的活动类型。例如,更多用户可能在工作时间内处于活跃状态,或者系统可能需要在每个月底执行昂贵的分析计算。活动中也可能出现突发和意外的爆发。如果系统的处理要求超过了可用资源的容量,会导致性能降低,甚至失败。如果系统必须达到约定的服务水平,这种失败可能是不可接受的。
根据应用程序的业务目标,有很多策略可以处理云中的不同负载。一种策略是在任何给定时间使用自动伸缩功能置备与用户需求相匹配的资源。这有可能始终满足用户需求,同时优化运行成本。然而,虽然自动伸缩可以触发附加资源的置备,但它不是即时的。如果需求快速增长,可能会出现资源短缺的时间窗口。
解决方案
自动伸缩的另一种策略是限制应用程序能使用的资源,在达到限制时限流。系统应该监控资源的使用情况,以便当使用率超过阈值时,可以阻止来自一个或多个用户的请求。这将使系统能够继续运行并满足任何已实施的服务水平协议(SLA)。有关监控资源使用情况的更多信息,请参阅仪器与遥测指南。 系统可以实施多种节流策略,其中包括:
- 在给定的时间内,拒绝每秒超过n次的请求的速率访问系统API的个人用户。这要求系统计算每个租户或运行应用程序的用户的资源使用情况。相关内容请参阅服务计量指南。
- 禁用或降低次要服务的功能,让基本服务有足够的资源不受阻碍地运行。例如,如果应用程序是流视频输出,则可以切换到较低的分辨率。
- 使用负载分级来平滑活动量(关于此方法更多内容在基于队列的负载均衡模式有更详细地介绍)。在多租户环境中,这种方法将降低每个租户的性能。如果系统必须支持具有不同SLA的租户组合,高价值租户的工作可能会立即执行。其它租户的要求可以阻止,在积压减轻时处理。优先级队列模式可用于帮助实现此方法。
- 延迟执行代表优先级较低的应用程序或租户执行的操作。这些操作可以暂停或限制,产生异常并通知租户系统忙碌并且稍后应重试该操作。
该图显示了使用三种特性的应用程序的资源使用的区域图(内存,CPU,带宽和其它因素的组合)与时间的关系。特性是功能区域,例如执行特定任务集的组件,执行复杂计算的代码片段或提供诸如内存中缓存服务的元素。这些特征标记为A,B和C.
功能线下方的区域表示应用程序在调用此功能时使用的资源。例如,功能A的线下方区域显示了正在使用功能A的应用程序消耗的资源,而功能A和功能B的线之间的区域表示应用程序调用功能B所使用的资源。汇总区域针对每个功能,显示系统的总资源使用情况。
上图说明了延迟操作的效果。就在T1之前,分配给使用这些功能的所有应用程序的总资源达到阈值(资源使用限制)。此时应用程序有可能耗尽可用资源。该系统功能B没有功能A或功能C重要,因此暂时禁用了该功能,并释放了它所使用的资源。在T1和T2之间,使用功能A和功能C的应用程序正常运行。最终,这两个功能的资源利用减少到当时间T2有足够的能力来再次启用功能B的时候。 自动伸缩和限流方法也可以组合起来,以帮助应用程序将响应保持在SLA内。如果需求预期保持高位,限流在系统水平扩展时提供临时解决方案。此时,可以恢复系统的全部功能。 下图显示了系统中运行的所有应用程序随时间的整体资源使用情况的区域图,并说明了如何将限流与自动伸缩相结合。
在时间T1,达到指定资源使用软限制的阈值。此时系统可以开始水平扩展。但是,如果新的资源不能快速可用,那么现有资源可能会耗尽,系统可能会失败。为了防止这种情况发生,系统暂时被限流,如前所述。当自动伸缩完成并且有额外的资源可用时,限流可以放宽。
问题和注意事项
在决定如何实现此模式时,您应该考虑以下几点:
- 应用程序限流和使用的策略的架构决策是影响系统整个设计。在应用程序设计早期就应该考虑限流,因为系统实现后再添加就不太容易了。
- 限流必须快速执行。系统必须能检测活动的增加并相应地作出反应。在负载缓解之后,系统还必须快速恢复到原来的状态。这要求不断捕获和监视适当的性能数据。
- 如果服务需要临时拒绝用户请求,则应返回特定的错误代码,以便客户端应用程序了解拒绝执行操作的原因是由于限流。客户端应用程序可以等待一段时间再重试请求。
- 系统自动伸缩时可以使用限流作为临时措施。在某些情况下,如果发生突发事件,并且延续时间不会很长,那么最好只是限流而不是缩放,因为伸缩会大大增加运行成本。
- 如果系统自动调整时将限流用作临时措施,而资源需求增长非常快,即使在节流模式下运行,系统也可能无法继续运行。如果不能接受,请考虑维持更大的容量储备并配置更积极的自动伸缩。
何时使用该模式
使用此模式:
- 确保系统继续符合服务水平协议(SLA)。
- 防止单一租户垄断应用程序提供的资源。
- 处理突发事件。
- 通过限制保持其运行所需的最大资源水平来帮助优化系统成本。
案例
最后一个数字说明如何在多租户系统中实现限流。来自每个租户企业的用户访问云端托管的应用程序,他们填写并提交调查。该应用程序包含监视这些用户向应用程序提交请求的速率的工具。
为了防止一个租户的用户影响所有其它用户的应用程序的响应能力和可用性,对每个租户可以提交的用户每秒的请求数量进行限制。超出限制的请求应用程序会阻止。
相关模式和指南
以下模式和指南在实现此模式时也可能相关:
- 仪表与遥测指南。调节取决于收集的关于服务使用量的信息。该指南描述如何生成和捕获自定义监视信息。
- 服务度量指南。描述如何度量服务的使用,以了解如何使用。该指南可用于确定如何限制服务。
- 自动伸缩指南。节流可以作为临时措施用于系统自动伸缩,或者不需要系统自动调整。该指南包含有关自动伸缩策略的信息。
- 基于队列的负载均衡模式。基于队列的负载均衡是实现限流的常用机制。队列可以充当缓冲区,有助于将应用程序发送的请求的速率均匀地传递到服务。
- 优先级队列模式。系统可以使用优先级排队作为其节流策略的一部分,以维护关键或更高价值应用程序的性能,同时降低次要应用程序的性能。