开发者学习笔记【阿里云云原生助理工程师认证(ACA)课程:消息队列和应用工具产品体系-限流降级概念简介】
课程地址:https://edu.aliyun.com/course/3112075/lesson/19041
消息队列和应用工具产品体系-限流降级概念简介
高可用常见策略和 AHAS 限流降级概念简介
本章学习高可用架构设计中其他的常见高可用策略以及阿里巴巴的应用高可用产品AHAS。
高可用是系统设计中最重要的技术指标,而在互联网场景下,用户的高并发访问是系统高可用的最大挑战之一。对于这种场景,首先,通过弹性伸缩来处理数据计算部分的突发流量。其次,在系统的大功能模块之间的互相调用时,可以采用异步调用的方式进行处理,同时使用消息队列来实现模块的解耦和消息的削峰填股。但是在模块内部涉及到数据读取或存储的同步调用时,应该如何来进行高并发场景下,的高可用设计和应对呢?
限流、熔断降级的定义1
在这种场景下,就要用到不同的技术,一般来讲,主要的技术手段有三种,他们是缓存、限流和熔断降级。缓存在阿里云中有单独的产品可以进行技术支持,而限流和熔断降级则是我们接下来要重点介绍的。
限流的概念在同步调用的场景下,当后端服务收到前端请求时,无法像异步服务一样将请求长期缓存,是必须在有限的时间内决定是否响应本次请求。
为了处理这种需求,比较推崇的高可用做法是在服务提供者的上游安装一个限流器组建,由限流器负责处理是否响应请求。限流器组件的工作原理大致如下,首先,限流器会时刻检查流经限流器进入服务提供者的流量,如果当前流量没有超过后端服务提供者的处理能力,则限流器放行请求流量进入后端服务。一旦当前通过限流器的流量超过限流器设定的阈值时则限流器将前端请求直接返回错误,这样就避免了前端长时间的等待和后端服务被大流量压垮的情况。
限流、熔断降级的定义2
同步调用不向异步调用,后端服务可以将前端请求缓存起来,等待合适的时间再做处理,是必须在很短的时间内做出判断,对请求做出处理或拒绝的选择。这种情况下,同步服务效用方式的失败几率就远远大于义务服务调用方式。分步式微服务架构中,服务的相互调用关系非常复杂,一个底层服务的失败往往会导致上层应用出现大面积的雪崩性失败。因此,为了避免这种情况的出现,在分布式调用中就需要另一种机制进行对应,这就是熔断和降级功能。
熔断功能:熔断功能的定义是服务请求者时刻监视发往后端应用请求的失败率和响应速度。
如果发现请求的失败率过高或响应速度过慢,则说明后端服务处于不稳定的状态。这时候为了避免增加不稳定的后端服务的压力,会在一定时间内放弃对后端服务的调用,使其有喘息的机会,从而避免了后端服务因为不稳定的状态而返回错误。但是前端因为后端返回的错误而不断重试,反而加剧后端服务压力所带来的恶性循环。简单的说,熔断功能就是前端应用为后端的稳定提供了一个自恢复保险的功能,当后端不稳定时,自动切断同后端服务的通讯,保险丝断开。而当后端服务经过一段时间恢复之后,则再次恢复对后端服务的调用保险丝复位。
限流、熔断降级的定义3
降级服务是指当前端服务向后端发起请求,当后端服务却因为限流、熔断、自身错误、超时等原因失败时,前端服务为了避免调用错误雪崩的发生,不会简单的终止业务流程,再向上级服务返回错误,而是会为后端服务提供一种或几种功能和资源消耗比较低但可用度较高的方案进行备份,以应对后端服务失效的情况。这里要注意的是,降级服务中提到的备份方案和主备方案中的备份方案并不一样,主备方案中的备份方案指的是和主方案完全相同的业务逻辑实现,而降级服务中的备份方案指的是调用方准备临时性的替代方案,以应对当主服务失效时的异常情况,从而降低错误雪崩出现的概率,
以下图为例
在默认情况下,淘宝的首页会为每个用户提供个性化的实时产品推荐服务,而这个推荐系统相对来讲计算量会比较大,消耗的计算资源也比较多。这种情况下,一旦因为某些原因,如计算资源吃紧或业务出现了故障导致个性化推荐服务出现了故障,按照业务高可用的原则,不能直接将错误返回给淘宝网首页,导致首页出现问题。这个时候开发者就会按照降级方案,调用一个功能较低一级但资源消耗比较少可靠度比较高的公共实时页面服务生成一个所有用户都统一的实时页面来替代原有的个性化实时页面,来保证淘宝网页面的正常显示。如果在极端情况下,公共实时首页也无法提供服务,首页服务则会再次进行降级,通过一个不需要计算同时可靠度最高的静态备份页面来替代原有的实时页面,已保证淘宝网首页的最基本业务功能的高可用性。
阿里开源限流降级产品 Sentinel
前面介绍了熔断和限流降级的功能定义,同学们可以回想一下,在微服务核心组件的课程中,我们曾经为大家介绍了熔断器的概念,实际上限流和熔断降级功能所要面解决的问题和熔断器基本是一致的,都是针对分布式服务调用时可能出现的错误,提供一种安全的容错和处理机制。而在微服务组件的学习过程中,我们也讲过,开发者如果想自己开发一个功能完备、可靠度高的微服务组件,是一件很消耗精力的事情,因此,如果同学们在项目开发中有流量控制方面的需求。我们为大家推荐阿里巴巴的开源限流降级产品Sentinel,Sentinel是面向微分布式服务架构的高可用流量防护组件,在2012年诞生之时,主要是被用来进行阿里巴巴内部服务的入口流量控制。而在2013年到2017年的五年内,Sentinel在阿里巴巴内部迅速发展,成为了底层基础技术模块,提供了从限流、流量、整形、熔断、降级、系统负载保护、热点保护等多个维度的高可用功能,覆盖并承接了阿里巴巴近十年来的双11大促流量下所有核心场景的高可用流控功能。
2018年Sentinel正式开源后,它的使用范围逐渐从单一的微服务组件扩展到了企业级架构的各个组件。借助开源社区的力量,Sentinel提供了与NGINX、 CLOUD NATIVE、 GRPC等组件进行无缝整合的解决方案。从而构建出一套针对整体企业架构的高可用流控解决方案,而在2019年至今,Sentinel也先后推出了C++和Go语言版本,同时针对下一代微服务架构Service Mesh提供了集群流量解决方案。解决Service Mesh架构下不同开发语言之间的限流问题,继续朝着与原生的方向进行了演进。