天天看点

深度解析微服务高并发流量服务降级、限流、熔断、流量效果控制

作者:程序员高级码农II

基础知识

本篇主要介绍服务降级、限流、熔断、流量效果控制等概念,解读Sentinel的一些特性,并通过对Sentinel性能压测介绍Sentinel的性能表现。

本篇内容主要包括以下几个方面。

• 服务降级、限流、熔断、流量效果控制。

• Sentinel的特性。

• Sentinel性能压测。

服务降级、限流、熔断、流量效果控制

限流,是指控制服务在单位时间内的流入流量,也就是控制服务在单位时间内处理的请求总数。

熔断,是指当下游服务突然变得不可用或者不稳定时,服务可以自动切断与下游服务的交互,从而保证自身可用。就像保险丝一样,当电流异常升高到一定数值时,保险丝就会熔断以切断电流。

流量效果控制,是指控制流量以达到某种效果,如控制每毫秒只放行一个请求以达到匀速通过的效果。常见的流量效果控制有匀速通过、冷启动。

服务降级,表示临时暂停一些不是那么重要的服务,以释放更多资源给重要的服务使用;也表示暂时由计划A改为计划B,计划A为正常提供的服务,计划B为临时提供的服务,如快速响应“系统忙碌,请稍后再试”的提示。

常见的服务降级实现方式有限流降级、熔断降级、开关降级。

限流降级

假设服务A需要依赖服务B完成客户端的一次请求,如图1.1所示。这时通过压测预测服务B单节点1秒内所能处理的最大并发请求数为200个,若为服务B配置限流阈值为200 QPS,则当1秒内服务B接收的请求数超过200个时,超出的请求就会被服务B拒绝。

深度解析微服务高并发流量服务降级、限流、熔断、流量效果控制

图1.1 限流降级

对于超出阈值的流量除直接拒绝外,还可以采取一些策略以处理更多的请求,即流量效果控制。例如,均速排队这种方式主要用于处理间隔性突发的流量,如某一秒有大量的请求到来,而接下来的几秒都处于空闲状态,这时我们希望系统能够在接下来的空闲时间内逐个处理这些请求,而不是在第一秒直接拒绝多余的请求。

熔断降级

假设服务A需要依赖服务B完成客户端的一次请求,那么服务A如果能够感知服务B的状态,在服务B不行的时候不再请求服务B,就能确保服务A自身不会受服务B的影响。如何知道服务B到底行不行呢?

如图1.2所示,假设1秒内向服务B发送230个请求,结果有30个请求发生超时异常或响应异常,根据这个数字就可以预测后续请求也大概率不能被服务B正常处理。服务B已经处理不过来了,那么后续的请求就没有必要再发送了,因为发送出去也会显示异常。

深度解析微服务高并发流量服务降级、限流、熔断、流量效果控制

图1.2 熔断降级

当然,服务B不会一直不行,当服务B恢复之后,服务A也应该能感知到,所以熔断需要以一个时长为周期,如1秒。这个周期也被称为时间窗口。每个时间窗口都要重新计算请求总数、异常总数这些指标数据,这样熔断就会在下一个周期自动恢复。

熔断降级的常见降级策略如下。

(1)在每秒请求异常数超过多少时触发熔断降级。

(2)在每秒请求异常错误率超过多少时触发熔断降级。

(3)在每秒请求平均耗时超过多少时触发熔断降级。

提示:请求异常数越多、请求异常错误率越大或请求平均耗时越长,都说明服务的处理能力在下降。

开关降级

开关降级也是服务降级的一种实现方式。开关降级用于在有限的硬件条件下,提升系统核心功能的并发处理能力,以最少的硬件成本应对流量高峰。

电商项目开发涉及较多开关降级。一般在“大促活动”之前,都会通过开关方式将一些无关紧要的业务接口变成“不可用”。常见的实现方式是使用Redis控制服务降级的开关,如图1.3所示,在服务A收到服务B的请求时,先从Redis获取开关配置,若开关打开,则直接拒绝请求,并响应一个表示当前服务降级的状态码给调用者。

深度解析微服务高并发流量服务降级、限流、熔断、流量效果控制

图1.3 开关降级

控制服务降级开关的方式可以是人工控制,也可以是定时任务,即在某个时段开启、某个时段关闭。

提示:定时任务控制服务降级开关的方式适合固定时间段请求突增的场景,例如,点外卖的高峰期在中午,就可以在上午11:00左右打开开关,在下午1:30之后关闭开关。

本文给大家讲解的内容是深度解析微服务高并发基础知识:服务降级、限流、熔断、流量效果控制

  1. 下篇文章给大家讲解的内容是度解析微服务高并发基础知识:Sentinel的特性
  2. 感谢大家的支持!

继续阅读