sentinel原理源码分析系列(七)-限流

限流的目的有两个,

一,防止资源过度使用,造成系统不稳;二,大流量有序地通过

上图是参与限流的类互动图,首先解释限流规则的设置

指标

限流依赖的统计指标,线程数/QPS,统计插槽介绍过,increaseThreadNum/addPassRequest是为了统计这两个指标

流控行为

流控行为决定处理大流量通过的方式,类图展示sentinel实现了多种流控行为,保证不超限

流控策略

依据调用关系限流

  1. 调用方限流,例如,某个调用方流量很大,为了保护其他调用方,对流量大的调用方限流
  2. 关联资源限流,针对两个互相影响的不同类型的资源,限流一个资源,保护另一个资源,例如,读数据资源和写数据资源,通常写数据会锁数据,影响读,限流写数据资源,保障读数据有一定流量
  3. 链路限流,针对相同的资源不同的入口,回想下++构建调用链路++图,不同的Context同一资源,场景举例,vip客户和普通客户的调用入口,vip不限流,普通客户限流

**注意:**设置不是单选题,同一个资源可有多个规则,但规则符合约束

实现分析

上图限流检查实现,分两步,第一,选择统计数据来源;第二,流量控制器适用统计指标,得出结果

1. 选择统计Node

上图选择统计Node的逻辑,包括两方面:

a. 检查limitApp/origin设置的合规性

合规1 :limitApp.equals(origin) && filterOrigin(origin) 设置调用方限流,不能是"default"和"other",好理解,"default"和"other"是另外两种情况

合规2:limitApp设置"default",规则2是在不违反规则1后,不用考虑origin和other设置

合规3:策略是other,设置的 origin不能是其他规则的limitApp,即在另一个规则设置为限流调用方,限流规则不能相互矛盾

这3个合规要求是白名单,除此之外不合规,符合可以进入选择统计node

b. 选择统计node

统计Node选择由调用方和策略组合决定,下面通过图表展示

|--------|-----------------------|---------------------------------|------------------------|
| 调用方/策略 | 直接限流 | 关联资源限流 | 链路限流 |
| 指定调用方 | 本Context的origin node | 指定资源(refResource )的cluster node | 本 Context 的DefaultNode |
| 不区分调用方 | 本Context的cluster node | 指定资源(refResource )的cluster node | 本 Context 的DefaultNode |

其中,**++指定调用++**方包括指定一个和除指定外两种情况

  • 指定调用方---直接限流 限流origin,选择origin node
  • 不区分调用方---直接限流 选择聚合同一资源不同Context的cluster node
  • 关联资源限流 选择关联资源refResource的cluster node,关联资源整体限流
  • 链路限流 选择本入口的DefaultNode,限本入口,不限另一个入口同类型的资源

另一个Context,同一类型的资源,适用同一个规则,refResource与Context名称不等,不限流

这里可以看出"构建调用链"的"苦心",都是为不同的限流服务

2 流量控制器

上图是目前控制器的实现, 可分成两类,第一,超限直接降级;第二,以一定算法有序通过,保证不超限

具体算法实现不分析,可以参看官方文档,或者实现类的注释

相关推荐
kkoral1 天前
单机docker部署的redis sentinel,使用python调用redis,报错
redis·python·docker·sentinel
墨白曦煜1 天前
深入剖析 Redis 客户端:Sentinel 模式下的“寻址”与“感知”艺术
数据库·redis·sentinel
遇见火星1 天前
Redis高可用-哨兵模式(Sentinel)
redis·sentinel
YDS8293 天前
SpringCloud —— Sentinel详解
java·spring cloud·sentinel
后端小张3 天前
【JAVA 进阶】深入理解Sentinel:分布式系统的流量守卫者
java·开发语言·spring boot·后端·spring·spring cloud·sentinel
小马爱打代码3 天前
面试题:Hystrix与Sentinel区别
hystrix·sentinel
破烂pan5 天前
Python 整合 Redis 哨兵(Sentinel)与集群(Cluster)实战指南
redis·python·sentinel
库库林_沙琪马6 天前
3、Sentinel
服务器·网络·sentinel
大大大大物~6 天前
Spring Cloud熔断与降级:核心区别与实践指南【怎么理解?解决了什么问题?各自的适用场景?Sentinel实现代码示例】
spring cloud·sentinel·熔断·降级
serendipity_hky7 天前
【SpringCloud | 第3篇】Sentinel 服务保护(限流、熔断降级)
java·后端·spring·spring cloud·微服务·sentinel