一. 简单介绍
- 假设当前 Sentinel 监控的服务中有两个接口
- 针对整个服务,或针对服务中的指定接口添加流量控制设置
- 解释流量控制规则
- 资源名称: 唯一名称,默认是请求接口路径
- 针对来源: 针对调用者进行限流,也就是调用某个服务的上层服务名称,默认是 default 不区分
- 阈值类型:
QPS : 每秒请求的数量,当调用的 QPS 达到阈值时进行限流
线程数: 当前调用服务的线程数达到阈值时进行限流
- 是否集群: 不需要集群
- 流程模式:
- 直接: 调用的api达到限流条件时直接限流
- 关联: 关联的资源达到阈值时,就限流自己
- 链路: 只记录指定的链路上的流量(指定资源从入口资源进来的流量,如果达到阈值进行限流,针对来源的限流)
- 流程效果:
- 快速失败: 直接失败抛出异常
- WarmUp 预热: 阈值除以codeFactor(冷加载因子,默认3)的值,从阈值 /codeFactor,经过预热时长,才达到设置的 QPS 阈值
-
可以通过设置Qps或线程数量两种方式来实现限流,不同的地方是Qps指定的是单位时间内接收到的请求数量,线程指的是单位时间内同时访问的数量,线程数量方式中没有流程效果设置
二. 流控模式
"直接"快速失败
- 设置 test1接口访问1秒内只允许调用一次,"快速失败"当超过阈值时默认会通过 Sentinel 响应错误信息 “Blocked by Sentinel (flow limiting)”
"关联"快速失败
- 当前被 Sentinel 监控的服务中有 test1() 与test2()两个接口
- 可以简单理解为: test1() 关联 test2() 当test2() 的请求达到阈值时,对 test1() 进行限流
- 案例: 在电商项目中,当支付接口请求达到阈值时,对下单接口进行限流
三. 流控效果
快速失败
当达到阈值时,默认会通过 Sentinel 返回错误信息, “Blocked by Sentinel (flow limiting)”,可以配置指定失败时执行的 fallback方法,源码Sentinel下的 DefaultController
WarmUp 预热
- 阈值除以codeFactor(冷加载因子,默认3)
- 源码 com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController 中的
- 假设当前设置 test1() 接口 QPS 方式阈值为12,WamUp预热时长为5,会使用10/3默认冷加载因子等于4,在接收请求时会以4作为阈值,在指定的预热时长5秒内慢慢的增加到最终的阈值12
排队等待
- 让请求以均匀的速度通过,控制请求的通过时间,对应漏桶算法
- 假设 test1() 接口 QPS方式,设置阈值为1,设置匀速等待 2000 毫秒,假设当请求达到阈值时,后续请求会进行排队等待,以2000毫秒的速度一个一个的排队处理
- 源码 com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController