原创 summer 51CTO技术栈
“ 前段时间,钉钉、淘宝纷纷崩溃,上网课的同学和老师反映钉钉黑屏、中断、无法进入等问题,同学们还没来得及欢呼雀跃,1 小时候后钉钉就在微博宣布满血复活,这已经不是阿里系软件第一次崩溃了,但这是持续时间最长的一次。
图片来自 Pexels
这样的局面到底是要归结于谁的原因呢?万万没想到,一个办公软件竟然被中小学生打败了。
其实主要问题还是出在用户量突增这个问题上,阿里纵使使用了将用户请求均匀分配到多个服务器处理,以解决单个服务器的单点瓶颈问题的负载均衡。
但如果用户请求数非常多的话,服务器能力达到上限,还是无法处理所有的用户请求,这个时候就出现了之前说的钉钉网课黑屏、中断的问题。
但是,在双十一、双十二这类秒杀场景时,也有大流量的用户突增,淘宝、天猫是怎么做到不崩溃的呢?我们可以参考一下阿里开源的流量控制框架 Sentinel。
流量控制框架 Sentinel
Sentinel 是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。
如下图所示是 Sentinel 的基本框架:
①流量控制
在分布式系统下,控制每个服务器接收的请求数,以保证服务器来得及处理这些请求,也就是说尽可能保证用户请求持续地被处理,而不是让大量的用户请求“阻塞”在服务器中,等待被执行,通俗点说就是“疏而不堵”。
Sentinel 的核心原理是,监控应用流量的 QPS(请求数 / 每秒)或并发线程数等指标,当达到指定阈值时,采取一定的策略对流量进行控制,避免系统被瞬时的流量高峰冲垮,保障应用高可用性。
Sentinel 实现限流的方式有很多种,最经常使用的有两种:抛出异常的方式定义资源和注解方式定义资源。
首先,我们来看一下抛出异常的方式定义资源。
抛出异常的方式定义资源的方式对代码侵入性较高,需要在接口调用的地方通过 try-catch 风格的 API 对代码进行包装。
然后,再看一下注解方式定义资源。
抛出异常的方式定义资源的方式通过 try-catch 风格的 API 可以实现限流,但是对代码侵入性太高,推荐使用注解的方式来实现。
②熔断降级
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。
由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。
Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断。
有关业务流量突发的应对方法,王鹏程老师在大咖来了第 16 期会进行更全面的讲解。