微服务高并发流量服务降级、限流、熔断、流量效果控制
基础知识
本篇主要介绍服务降级、限流、熔断、流量效果控制等概念,解读 Sentinel 的一些特性,并通过对 Sentinel 性能压测介绍 Sentinel 的性能表现。
本篇内容主要包括以下几个方面:
服务降级、限流、熔断、流量效果控制。
Sentinel 的特性。
Sentinel 性能压测。
服务降级、限流、熔断、流量效果控制
限流,是指控制服务在单位时间内的流入流量,也就是控制服务在单位时间内处理的请求总数。
熔断,是指当下游服务突然变得不可用或者不稳定时,服务可以自动切断与下游服务的交互,从而保证自身可用。就像保险丝一样,当电流异常升高到一定数值时,保险丝就会熔断以切断电流。
流量效果控制,是指控制流量以达到某种效果,如控制每毫秒只放行一个请求以达到匀速通过的效果。常见的流量效果控制有匀速通过、冷启动。
服务降级,表示临时暂停一些不是那么重要的服务,以释放更多资源给重要的服务使用;也表示暂时由计划 A 改为计划 B,计划 A 为正常提供的服务,计划 B 为临时提供的服务,如快速响应“系统忙碌,请稍后再试”的提示。
常见的服务降级实现方式有限流降级、熔断降级、开关降级。
限流降级
假设服务 A 需要依赖服务 B 完成客户端的一次请求,如图 1.1 所示。这时通过压测预测服务 B 单节点 1 秒内所能处理的最大并发请求数为 200 个,若为服务 B 配置限流阈值为 200 QPS,则当 1 秒内服务 B 接收的请求数超过 200 个时,超出的请求就会被服务 B 拒绝。
对于超出阈值的流量除直接拒绝外,还可以采取一些策略以处理更多的请求,即流量效果控制。例如,均速排队这种方式主要用于处理间隔性突发的流量,如某一秒有大量的请求到来,而接下来的几秒都处于空闲状态,这时我们希望系统能够在接下来的空闲时间内逐个处理这些请求,而不是在第一秒直接拒绝多余的请求。
熔断降级
假设服务 A 需要依赖服务 B 完成客户端的一次请求,那么服务 A 如果能够感知服务 B 的状态,在服务 B 不行的时候不再请求服务 B,就能确保服务 A 自身不会受服务 B 的影响。如何知道服务 B 到底行不行呢?
如图 1.2 所示,假设 1 秒内向服务 B 发送 230 个请求,结果有 30 个请求发生超时异常或响应异常,根据这个数字就可以预测后续请求也大概率不能被服务 B 正常处理。服务 B 已经处理不过来了,那么后续的请求就没有必要再发送了,因为发送出去也会显示异常。
当然,服务 B 不会一直不行,当服务 B 恢复之后,服务 A 也应该能感知到,所以熔断需要以一个时长为周期,如 1 秒。这个周期也被称为时间窗口。每个时间窗口都要重新计算请求总数、异常总数这些指标数据,这样熔断就会在下一个周期自动恢复。
熔断降级的常见降级策略如下:
在每秒请求异常数超过多少时触发熔断降级。
在每秒请求异常错误率超过多少时触发熔断降级。
在每秒请求平均耗时超过多少时触发熔断降级。
提示:请求异常数越多、请求异常错误率越大或请求平均耗时越长,都说明服务的处理能力在下降。
开关降级
开关降级也是服务降级的一种实现方式。开关降级用于在有限的硬件条件下,提升系统核心功能的并发处理能力,以最少的硬件成本应对流量高峰。
电商项目开发涉及较多开关降级。一般在“大促活动”之前,都会通过开关方式将一些无关紧要的业务接口变成“不可用”。常见的实现方式是使用 Redis 控制服务降级的开关,如图 1.3 所示,在服务 A 收到服务 B 的请求时,先从 Redis 获取开关配置,若开关打开,则直接拒绝请求,并响应一个表示当前服务降级的状态码给调用者。
控制服务降级开关的方式可以是人工控制,也可以是定时任务,即在某个时段开启、某个时段关闭。
提示:定时任务控制服务降级开关的方式适合固定时间段请求突增的场景,例如,点外卖的高峰期在中午,就可以在上午 11:00 左右打开开关,在下午 1:30 之后关闭开关。
评论