首页 服务网格 操作指南 流量管理 分布式系统的高可用能力构建

分布式系统的高可用能力构建

更新时间: 2025-03-11 14:32:04

服务网格 ASM(Service Mesh)支持统一管理集群南北与东西向的所有流量,通过对流量的超时、重试、限流、熔断、排队、预热、回退等配置,基于服务网格从多个维度提升分布式系统的高可用能力。本文主要介绍各种服务网格高可用能力的概念以及使用场景。

能力介绍

在分布式系统中,流量的防护与调度是确保系统稳定性和高可用能力的重要因素。由于分布式系统的高度复杂性,任何流量的波动和异常都有可能导致服务失败、雪崩、资源耗尽等问题。

在传统的服务开发中,使用Resilience4j等框架可以实现限流、熔断等高可用能力。与这种方式相比,服务网格在网络基础设施级别提供支持,无侵入式进行集成,降低高可用能力的耦合并提升配置灵活性。

各高可用能力详细说明如下:

流量限流:保护系统免于过载

限流是分布式系统中保障服务稳定性的基础手段之一。在面临高流量冲击、服务过载、资源耗尽或恶意攻击的情况下,通过配置限流防护,可以实现对流量的精准控制,从而保护后端服务的稳定性,降低成本并提升用户体验。同时,在业务存在多租户场景的情况下,还可以通过对每个租户进行分别限流,达到精细化流量管理和确保公平使用的目的。

ASM通过多种限流策略为分布式系统提供全面的保护能力:

本地限流与全局限流

网格代理Envoy原生支持两种类型的限流防护方式:本地限流和全局限流。

适用场景

本地限流与全局限流可以支持大部分常用的限流场景:对集群中的某个服务进行限流、或在网关的特定路由上进行限流,支持匹配特定的请求单独指定限流配额。

  • 全局限流:允许跨多个服务对请求进行请求速率限制,这种方式基于集群中所有服务共享的集中限流服务实现。全局限流服务需要依赖一个单独部署的全局限流服务以及Redis数据库。

  • 本地限流:本地限流配置更为简单,决策速度也更快,因为它不依赖于额外的组件。然而,每个副本都有各自独立的速率限制器。这意味着,如果您在一个副本上受到限流,另一个副本上可能不会受到限制。

基于ASM流量调度套件进行限流

ASM流量调度套件是一套基于服务网格的流量统一调度架构模式,以及基于该架构模式开发的多种流量调度策略的统称,旨在对云原生分布式应用中的请求进行统一的负载调度与管理。ASM流量调度套件支持使用RateLimitingPolicy策略进行限流。

适用场景

与本地限流/全局限流相比,RateLimitingPolicy支持按请求标签对请求进行分组,并在每个分组内单独限流的高级特性,适用于在多租户环境下对每个租户进行单独限流的精细化控制场景。

流量并发度控制:保护系统关键资源

并发度控制是另一种重要的高可用能力,它通过对请求并发数的精准管理,避免因过多的并发请求导致系统资源耗尽。相对于流量限流,并发度控制适用于一些依赖系统关键资源的服务(如线程池、数据库等),以保护系统关键资源并提高资源利用效率。

ASM提供两种主要的并发度控制机制:

基于ASM流量调度套件进行并发度控制

ASM流量调度套件支持使用ConcurrencyLimitingPolicy实现请求并发数控制

适用场景

当系统并发度承载能力相对固定时,可以针对集群中的某个服务配置固定的并发度限制,超出给定并发度的请求将返回429响应。

使用ASMAdaptiveConcurrency实现自适应并发控制

网格代理Envoy原生支持一种自适应的并发度控制方式,支持通过ASMAdaptiveConcurrency进行启用。ASMAdaptiveConcurrency采用自适应并发控制算法,从而尽可能使得并发限制数量在服务可承受的范围附近,同时拒绝超出该限制的请求(拒绝请求时会返回HTTP 503及错误信息reached concurrency limit)。

适用场景

当系统承载能力变化较大且难以准确估计时,可以通过ASM的AdaptiveConcurrency(自适应并发控制)来对系统进行并发度限制。同时,建议在启用AdaptiveConcurrency服务的后,通过DestinationRule为服务启用重试功能。这将使在minRTT计算期间被拒绝的请求能够通过Sidecar的重试机制尽可能成功返回结果。

流量熔断:隔离故障节点以防止雪崩效应

熔断机制是分布式系统中不可或缺的一环,它的作用是在某个服务出现异常时迅速切断对其的依赖,及时隔离故障服务,从而避免故障扩散到整个系统。

ASM在多个维度和级别上提供流量熔断功能:

连接池级熔断

连接池熔断是目标规则原生支持的熔断特性,可以限制工作负载到目标服务主机的最大HTTP/1或TCP连接数。

适用场景

连接池熔断通过TCP连接数限制实现熔断,作为一种底层比较基础的熔断策略,可以用于一些无法通过HTTP返回状态码方式判断的服务的熔断配置。

主机级熔断

主机级熔断同样是目标规则原生支持的熔断特性,通过请求5xx状态码观察在给定时间段内发生的故障数量。如果错误率超过阈值,则熔断器将断开请求,所有后续请求都将失败,直到熔断器被关闭为止。

适用场景

主机级熔断检测独立地作用于一个服务的每个上游主机。当一个上游主机持续返回5xx状态码时,该主机将会从负载均衡池中被驱逐一段时间,以达到熔断效果。其适用于检测一些由于单个工作负载问题导致所有的请求响应持续产生错误的情况,但不适用于对某个API接口进行熔断的场景。

路由级熔断

ASM支持为特定服务之间和特定路由上的东西向调用流量配置熔断规则。通过为服务间的东西向调用流量配置熔断规则,可以实现在特定的请求路由上,当流量失败率或响应超时次数达到阈值时,主动“切断”来自上游服务的请求。

适用场景

路由级熔断的检测生效在服务级别,可以在一条虚拟服务路由上对经过该路由的所有请求进行熔断检测。其适用于检测由于某些服务依赖或逻辑错误导致的特定服务API持续返回错误的情况。

流量回退:应对调用失败场景

当某个服务发生故障或无法使用时,回退机制会调用一个备用的服务来处理请求,以确保整个系统的稳定性和可用性。

适用场景

同时使用主机级熔断和流量回退,可以实现当一个服务的所有上游主机不可用时,改用备用服务提供相应的功能,在熔断发生时仍使整个系统保持一定的可用性。

流量预热:平滑过渡新版本部署

在传统的蓝绿部署或滚动更新中,新版本服务一旦上线就会立即承担全部流量,这可能导致瞬时压力过大而引发故障。相比之下,服务预热允许我们按照预定计划分阶段引入流量,例如先分配10%的请求,再逐步提升至50%、100%。这种方式比较适合那些具有较大冷启动成本的服务,比如服务需要时间来完成缓存预热、数据库连接初始化等准备工作。

ASM支持两种级别的流量预热能力:

慢启动预热

慢启动模式又称渐进式流量增加,是目标规则原生支持的能力。您可以为服务配置一个时间段,每当一个服务实例启动时,请求方会向该实例发送一部分请求负载,并在配置的时间段内逐步增加请求量。当慢启动窗口持续时间到达,就会退出慢启动模式。

适用场景

请求方向目标服务发送请求时,如果目标服务的上游主机端点处于慢启动窗口中,负载均衡器会适当降低分配给该上游主机的流量比例。这一能力适用于服务扩容或服务发布新版本的场景,用于对新启动的服务上游主机进行预热。

在新上线服务或可选上游主机端点有限的情况下,不适用慢启动预热功能。

基于ASM流量调度套件进行服务渐进式上线

当新服务发布时,通过同步配置LoadRampingPolicy可以使得服务接收到的流量逐渐增加,确保服务平稳上线。

适用场景

ASM流量调度套件使用一个请求采样器拒绝一定比例的请求。在服务上线初期请求采样器将以一个较大的比例拒绝发往服务的请求。而随着上线时间窗口推移,请求拒绝比例逐渐减少到0。和慢启动预热不同,该方式会将发往服务整体的请求进行部分拒绝,保证服务收到的所有流量缓慢增加,适用于新服务上线的场景,而不适用于服务扩容、服务新版本发布等场景。

流量超时与重试:增强服务调用可靠性

超时与重试是分布式系统中最常见的容错手段之一,均为虚拟服务原生支持的高可用能力。通过设置合理的超时时间和重试策略,确保在服务偶发出现响应错误的情况下,仍然使整体系统保持一定的可用性。超时的作用在于避免请求长时间挂起,而重试则用于弥补网络抖动或临时故障带来的影响。

请求排队与优先级调度:平稳度过流量高峰

请求排队是一种基于限流和并发度限制的机制:当请求速率或请求并发度超过系统承载上限时,后续请求不会被直接拒绝,而是进入请求队列,等待前序请求处理完毕后再进行处理。

ASM通过流量调度套件支持基于并发数、流量速率和延迟自适应的三种优先级调度策略,并在此基础上支持对排队中的请求进行优先级调度。请求优先级调度可以确保优先级高的请求率先得到响应,优先保障系统重要功能的平稳运行,或者优先确保某些高优先级租户的使用体验。

具体支持的请求排队与优先级调度策略包括:

可控并发下的请求优先级调度

通过配置ConcurrencySchedulingPolicy,以指定的并发数限制来判断流量是否过载,当请求并发数超过指定上限后,后续请求将被排队并根据请求优先级进行调度。

适用场景

该策略基于并发数限制来判断流量是否过载,适用于应用并发度限制,同时具有明显流量峰谷特征的服务。

可控速率下的请求优先级调度

通过配置QuotaSchedulingPolicy,以指定的流量速率来判断流量是否过载,当请求并发数超过指定上限后,后续请求将被排队并根据请求优先级进行调度。

适用场景

该策略基于流量速率限制来判断流量是否过载,适用于应用请求流速限制,同时具有明显流量峰谷特征的服务。

基于延迟自适应的请求优先级调度

通过配置AverageLatencySchedulingPolicy,将请求实时延迟与历史平均值进行比较来检测流量过载。当前请求延迟与历史平均延迟差异过大时,将判断系统发生过载,后续请求将被排队并根据请求优先级进行调度。

适用场景

当需要为请求进行排队和优先级调度,但难以确定服务可接受的最大请求速率或并发度时,可以通过此种自适应的方式对请求进行优先级调度。

上一篇: 解决WebSocket关闭时返回码不一致的问题 下一篇: 使用ASM构建分布式系统的容错能力
阿里云首页 服务网格 相关技术圈