在我们讨论系统稳定性的时候,其实核心的关键词就是容量规划,如何做好业务容量与系统性能的评估,是保障系统稳定性的关键。对于系统性能的评估,需要我们具备自动化工具来对系统进行性能压测,探测系统在实际业务场景下的基线数据,这是我们进行系统资源配置的基础,也是在应对流量增长时进行弹性扩容的依据。
在我们做好容量规划的前提下,在实际业务场景下,我们还是不可避免的会面对不确定的系统压力,在面对突发不确定流量的情况下,我们最担心的就是系统的“雪崩”。就像突然爆发的车流让道路交通瘫痪一样,我们的系统在突发流量下,很可能像多米诺骨牌一样,全链路的崩塌。
很多情况下,我们以为我们的系统能够这样:
但实际上确实这样
在系统发生雪崩的情况下,我们连基本容量规划的负载都保证不了。如何保障我们的系统能够在复杂多变的业务场景下,能够持续稳定的提供的负载处理能力。这就要求我们按照系统的容量规划,做好系统的限流保护,让超出负载的流量能够快速的failover,将系统无法承载的流量拒之门外,保护我们的系统不会发生雪崩。
如何做限流
在一般的概念中,我们在讨论限流的时候,首先会想到并发的限流,通过限制系统服务调用的并发数来对系统进行保护。这里面其实包含两层概念:线程数和QPS。
线程数是我们系统中实际活跃的处理线程的数目,而QPS是我们系统在一定时间度量范围内的访问速率。一般传统的限流手段是通过对活跃线程数进行控制来进行系统流量的控制。在现今复杂的互联网服务调用体系下,更常用的是QPS进行限制来达到我们系统保护的效果。
考虑我们现今大部分的互联网架构,一般业务系统会由几十甚至上百的微服务构成,一次业务请求的处理,涉及众多的微服务调用。从线程数的角度看,很难去对整体系统的流量做一个衡量。在我们对复杂的业务系统进行性能评估的时候,会使用全链路压测的工具来进行,衡量的目标也是基于系统的QPS.所以使用对QPS进行限制的手段,会更好的对业务系统进行一个负载保护。
在笔者多年稳定性的负责工作中,一般在系统的各个入口处使用QPS作为主要的限流保护手段,线程数限流更多是作为上游系统对下游系统的一种熔断机制来使用,保护上游系统在下游RT变长的情况下,不会被拖垮。
限流的实现
线程数限流
对于线程数的限流,一般通过令牌许可的方式实现,通过预置令牌的数目来控制系统的活跃线程数量,没有获取令牌的线程,快速的失败返回。
在线程的入口处获取许可令牌,在执行业务逻辑完毕的出口处归还令牌。在实现上一般使用try{……}finally{……}结构实现,在finally中进行令牌的释放。
线程数的限流多数用于简单系统的负载保护,及自我的熔断保护优雅降级,防止依赖的下游服务RT变长的情况下,造成自身系统性能下降。在例如天猫交易系统这种,依赖下游服务(库存、物流、商品、营销等)较多的系统中,一个服务的变慢可能会对处于核心的交易系统造成不良的影响,所以对于在交易系统中,对于依赖的核心服务都是设置一个自我保护的线程数限流值,在下游服务出问题的情况下进行优雅降级。
QPS限流
和线程数不同,QPS限流是对按照一定时间单位内的并发速率来对系统进行限制。QPS与线程数限流相比,最大的好处除了能够按照压测模型的测算进行设置外,在笔者看来,另一个最大的好处就是可以对流量进行削峰,防止流量突刺对系统资源进行穿透影响。
QPS虽然度量单位上是秒,但是一般的实现不会基于秒级进行计数统计来进行限流保护,基于秒级的计数时间窗口过大,不能够消除流量突刺。试想一下在一秒的时间窗口内,流量突发集中在后面10ms,那么在最后的时刻,系统流量会变成我们期望值的100倍,可想而知这个时候对于系统来说是多么可怕的灾难。
所以在实现上,一般基于时间窗口的分片来进行计数,将整个QPS的计数周期划分为多个时间窗口,将计数值分散在各个时间窗口进行控制和计算,这样能够避免上面提到的流量突刺的出现,能够有效的将流量进行削峰,将流量洪峰削平,放着洪峰对于系统资源的破坏,例如缓存的热点穿透。
在软件的世界里很奇妙,我们会发现很多东西没有银弹,软件的进化过程,就是跟着实际的场景不断的调优。基于时间窗口的QPS限流,虽然能够消除流量突刺的场景,但是不可避免的会造成流量的损耗。试想一下如果流量的分布不均匀,那么在流量少的时间窗口下,没有到达的流量实际是损耗的。
在实际场景中,例如天猫双十一零点高峰,流量实际在每个时间窗口都是处于极度饱和的状态,这个时候简单的窗口分片就能达到很好的限流效果。
在流量分布不均匀的情况下,我们可以实现动态的时间窗口分片,将不饱和的时间窗口流量在不超过系统负荷的情况下累加到下一时间窗口,这样可以降低流量的损耗。
Pontus-用友云限流服务
用友云iuap平台为了保证客户云端系统服务的稳定性,结合微服务平台的建设,推出了稳定服务套件之一的限流服务Pontus,帮助用友云客户构建稳定性的系统防护体系。
Pontus支持QPS和线程限流两种方式,结合用友云微服务治理平台,将限流服务通过中间件统一服务的方式,内置在应用的微服务框架体系中,对微服务接口提供统一的限流一级防护。
采用动态滑动窗口机制,能够对流量峰值进行削峰,并且最大程度的降低流量损耗。触发限流及后端接口响应超时时,自动触发接口降级。
pontus服务与用友云开发者中心无缝集成,包含在用友云中间件统一SDK中,用户应用在开发者中心部署之后,能够自动发现服务接口,并对相应服务接口进行限流配置。
源于电商大促多年实践场景,Pontus能够为云应用提供稳定一致的流量防护,进行流量削峰和系统熔断,为云应用的稳定性保驾护航。
原文地址:http://blog.51cto.com/14084875/2334683