2026-01-31 06:12:27
微服务系统流量控制
微服务系统在面对超预期的流量增长时,为确保系统整体的稳定和服务的可用性,需要系统性的建立流量控制(流控)预案。以下是关于微服务系统流量控制的详细解答:
一、流控机制
流控机制是微服务系统流量控制的核心,通过限制进入系统的流量,防止系统过载,确保服务有损但不可用,负载过高时优先保障核心服务或业务。
常见的限流算法
固定窗口算法(Fixed window):通过维护一个固定时间段内的计数值,每当一个请求到达时,计数值加1并判断计数值,若超过阈值则进入限流处理流程。固定时间段结束后,计数器清零,开启下一轮的计数。
优点:实现简单。
缺点:存在两个窗口边界突发流量问题,但窗口大小足够小时可忽略。

滑动窗口算法(Sliding window):取一个时间窗口,细分为N个小窗口,以小窗口作为最小滑动单位,每向前滑动一个小窗口执行一次固定窗口算法。
优点:可避免在两个时间窗口之间产生毛刺现象(小窗口之间仍然会产生毛刺)。
缺点:实现较复杂,时间窗口足够小的情况下,增加的效果不明显。

令牌桶算法(Token Bucket):按照固定速率往桶中添加令牌,允许输出速率根据突发大小而变化。请求处理前从桶中获取令牌,获取到令牌才进行处理,否则进入限流处理流程。
优点:开源组件多,使用简单;可应对短时间的突发流量。
缺点:突发流量可能造成系统负载出现明显波动。

漏桶算法(Leaky Bucket):将请求放入桶中,并以固定的速率从桶中获取请求进行处理,桶满时请求进入限流处理流程。
优点:可以保持系统负载平稳。
缺点:不允许突发流量,不能很好地应对突发流量,可能阻塞正常请求。

动态限流算法:根据服务处理请求的时延或系统负载等指标动态调整限流阈值,此处不做展开。
限流算法选型
业务流量在一定时期内不会有明显变化,存在短时间的流量突增,且系统通常能够容忍短时间内流量的小幅波动。因此,选择固定窗口算法作为流控算法(实际上是令牌桶算法的一种特例),取时间窗口大小为1秒,将两个窗口间可能出现的流量波动影响控制在秒级水平,保持系统负载平稳。
全链路分段自控
在微服务架构中,一个复杂的业务系统由一系列微服务构成处理链路。采用全链路分段自控的流控机制,通过在各个分段进行局部流控达成整体的流控目标,具备灵活性高、实现成本低的优点。
流控策略:以全链路为主线建立流控的整体视角,链路上各个阶段如同一个个流量管道,分段做流控。
实施步骤:绘制系统完整的处理链路,挑选出需要进行流控的阶段;分析各个阶段的流量流入、流出通道,在每一个流量入口点和出口点做流控。

二、处置指南
流控处置有两种方式:自动流控 + 人工介入。
可用性保障的优先级
服务重要性:在线服务 > 非在线服务。
接口重要性:P1 > P… > Pn > Pn+1。
依赖重要性:不可扩容的核心依赖 > 可扩容的核心依赖 > 非核心依赖。
选择处置手段的优先级
自动流控:自动触发默认的流控策略,不需要人工干预。
扩缩实例:根据模块的外部依赖或下游服务的承受能力选择扩容或缩容,通过运维平台操作。
调整阈值:更改单机流控配置或全局流控配置,需发起上线。
服务降级:选择降级的服务及比例,需更新热配置。
三、系统设计
根据系统对流量增长的敏感程度、业务对可用性的要求级别,以及实现成本、运维成本、流控的必要程度,分别采用中心化和去中心化的流控策略。
中心化流控实现
流量控制方式:微服务访问中心化的限流节点,由中心流控节点控制整体流量。
基于redis实现:利用redis的单线程及原子操作特性实现限流功能,适用于同步API接口。
优点:单个服务流量控制相对较准,在负载不均衡情况下表现更好。
缺点:依赖redis的稳定性,可能存在热点问题。
去中心化流控实现
流量控制方式:将单个微服务的流控阈值分解成服务实例阈值的加和。
基于单机实现:对每一个微服务的流量入口点和出口点,分别计算出合理的流控阈值上下限,作为默认阈值参数。
优点:配置本地化,实现简单,不依赖外部,稳定性表现相对更好,适用于异步化计算服务。
缺点:负载不均衡情况下,总体流控误差会较大。
四、风险评估
在实施流量控制时,还需考虑以下风险评估:
综上所述,微服务系统流量控制是一个复杂而重要的任务,需要综合考虑多种因素,制定合理的流控策略和处置指南,以确保系统在面对超预期流量增长时能够保持稳定和可用。