概述

在接连写了两篇关于限流的文章(《面试补习》- 你来说说什么是限流?, 限流神器Sentinel,不了解一下吗?)后,总感觉还差最后一点内容来闭环整个限流相关的内容,这两天在翻查相关文章后,找到了一篇通俗易懂的 《Sentinel 解密》 文章,感谢 寒舟大佬提供的帮助~ 将这部分内容补全。

1、Sentinel 概念

1.1、代码结构

1.2、核心概念

Resource

资源是 Sentinel 对所保护的内容的抽象,任何想保护的代码函数等都可以通过 SphU.entry 接口将其定义为一个资源,SphU.entry 接口的第一个参数描述了该资源的名称

Node

Node是sentinel中用来存储统计数据的内存结构,以树形结构和hash存储:

一个resource按照不同入口设置不同统计结点,存储context级别的统计信息;一个resource下设置统一的cluster node,存储resource粒度的统计信息;每个cluster node根据来源下挂不同origin node,存储各个来源的统计信息。

配置中不同限流模式其实最终对应的就是选择不同的node进行计算:

  • 直接模式: 选择cluster node
  • 关联模式: 选择关联resource的cluster node
  • 应用涞源: 选择origin node
  • 链路模式: 选择default node

Node 类型:

  • StatisticNode:最为基础的统计节点,是后续三种节点的父类,包含秒级和分钟级两个滑动窗口结构。
  • DefaultNode:链路节点,用于统计调用链路上某个资源的数据,维持树状结构。
  • ClusterNode:簇点,用于统计每个资源全局的数据(不区分调用链路),以及存放该资源的按来源区分的调用数据
  • EntranceNode:入口节点,特殊的链路节点,对应某个 Context 入口的所有调用数据。

Context

Context是对资源操作时的上下文环境, 同一个线程中通过thread local 进行传里, context中维护了currentEntry, 同一个线程中可以多次entry/exit, 所以entry同样维护了一个树状结构:

Entry

调用点,这里面保存着和某一特定资源的某一次调用相关的信息,比如这次调用的起始执行时间,结束时间,是否抛出异常,调用链路中的父子关系,该调用点对应资源的处理链(ProcessorSlotChain),还保存了该调用点所对应的资源统计节点

Slot

slot是规则处理器,通过责任链模式进行串联处理。

1.3、核心类图

sentinel主要通过Node实现结点维护统计信息、通过LeapArray实现滑动窗口算法。

2、Sentinel 流程

2.1、规则配置

应用通过订阅监听模式实现各种监听器,监听然后对应不同配置的进行更新,图中列出了几个主要监听器,如: 规则配置、基本配置、集群配置等。

2.2、规则验证

应用调用entry入口即启动了规则验证流程,主要步骤为获取context, 构建并执行slot chain,如果违反规则纪录失败计数,清理contxt;反之,则纪录成功计数,返回验证成功。

3、Sentinel 核心

3.1、限流算法

我们所熟知的限流算法包括: 1. 计数器 2. 固定窗口 3. 滑动窗口 4.漏桶 5.令牌桶等。

  • 1、计数器,维护一个计数器,访问进入计数器+1,如果超过阙值则拒绝、访问结束计数器-1。
  • 2、固定窗口,给定一个时间窗口,维护一个计数器、如果窗口内访问次数大于阙值则拒绝。
  • 3、滑动窗口,固定窗口有临界问题,所以提出滑动窗口思想,将一个大的时间窗口切分成更细粒度的子窗口,每个子窗口单独统计,每过一个子窗口的时间,就向右滑动一个子窗口。
  • 4、漏桶,滑动窗口不能解决平滑度问题,为了解决平滑度问题,提出漏桶算法进行流速控制。
  • 5、令牌桶: 跟漏桶算法相反,以很定的速度产生令牌,桶满则丢弃,请求访问时从桶里后去令牌,如果能够获取,则通过否则拒绝。

Sentinel中主要使用了计数器滑动窗口漏桶限流思想。比如对于线程数的流控,就是直接使用计数器进行限制,对于QPS的限制则使用了滑动窗口的思想,滑动窗口也是Sentinel的主要流控实现方式。

3.2、滑动窗口

Sentinel支持秒级的窗口,默认窗口大小1秒,假设分为5个子窗口,则每个子窗口的大小为200ms, 如上图,每个格子有个索引timeId, 那窗口是如何进行滑动呢?算法的关键实现就是在前面类图提到过的currentWindow()方法:

  • 1、根据当前时间戳计算timeId
  • 2、根据timdId获取当前子窗口
  • 3、如果子窗口不存在,则创建子窗口
  • 4、如果子窗口已经存在,则根据当前时间计算开始开始时间,对比子窗口的开始时间,如果开始时间一致,则说明此子窗口即当前窗口,如果大于子窗口时间,则需要滑动
  • 5、滑动其实就是resetWidow, 包括reset windowStartTime, window中的统计信息等,如上图所示

3.3、优先级

优先级的目的是为了区分正常流量和其他低优先级流量,比如压测流量。对于正常流量,如果超过阙值,不想直接拒绝,尝试借用将来窗口的指标,如果借用成功,则请求通过,如果借用失败,则拒绝。当时间窗口真正走到将来的时间点时,需要将借用窗口的计数器恢复设置。

那如何当前请求是否可以借用呢?如下图,主要维护一个借用时间阙值,计算一秒窗口内的总数有没有超过QPS,如果没有超过看借用时间是否超过借用阙值:

3.4、热点参数

一般资源的定义需要可枚举的,不能爆炸式的,假如对每个userId进行限流,这样会导致sentinel的存储空间爆炸式增长,最后导致OOM. 对于这种细粒度的参数限流,sentinel提供了热点参数方案。

如图:

热点参数就是在正常统计信息而外增加了参数统计,一样支持线程数和QPS两种限流方式,对于线程数,每个参数索引维护了一个LRU cache; 对于QPS,每个参数索引、每个子窗口、每个统计纬度维护了一个LRU cache, cache中维护了各种计数。通过LRU cache可以避免内存爆炸, 达到热点参数限流的目的。

点关注,不迷路

好了各位,以上就是这篇文章的全部内容了,我后面会每周都更新几篇高质量的大厂面试和常用技术栈相关的文章。感谢大伙能看到这里,如果这个文章写得还不错, 求三连!!! 创作不易,感谢各位的支持和认可,我们下篇文章见!

我是 九灵 ,有需要交流的童鞋可以 加我wx,Jayce-K,关注公众号:Java 补习课,掌握第一手资料!

如果本篇博客有任何错误,请批评指教,不胜感激 !

阿里P7大佬带你解密Sentinel的更多相关文章

  1. java面试官最爱问的垃圾回收机制,这位阿里P7大佬分析的属实到位

    前言 JVM 内存模型一共包括三个部分: 堆 ( Java代码可及的 Java堆 和 JVM自身使用的方法区). 栈 ( 服务Java方法的虚拟机栈 和 服务Native方法的本地方法栈 ) 保证程序 ...

  2. 这个厉害了,阿里P7大佬都在看的SpringCloud 总结,帮你梳理全部知识点!

    微服务 微服务架构是一种以一些微服务来替代开发单个大而全应用的方法,每一个小服务运行在自己的进程里,并以轻量级的机制来通信, 通常是 HTTP RESTful API.微服务强调小快灵, 任何一个相对 ...

  3. 转头条:阿里p7架构师:三年经验应该具备什么样的技能?

    问:工作中,有时候实现一个功能,会去看有没有现成的轮子可用.对于重复造轮子与改造轮子有什么看法? 答:一定会的,其实这也是一个提高技术能力的方法,比如今天想做个日期转换的功能,JDK8有日期的新特性就 ...

  4. 跟着阿里p7一起学java高并发 - 第19天:JUC中的Executor框架详解1,全面掌握java并发核心技术

    这是java高并发系列第19篇文章. 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadPoolExecutor及案例 介 ...

  5. 阿里P7终于讲完了JDK+Spring+mybatis+Dubbo+SpringMvc+Netty源码

    前言 这里普及一下,每个公司都有职别定级系统,阿里也是,技术岗以 P 定级,一般校招 P5, 社招 P6 起.其实阅读源码也是有很多诀窍的,这里分享几点心得: 首先要会用.你要知道这个库是干什么的,掌 ...

  6. 阿里P7岗位面试,面试官问我:为什么HashMap底层树化标准的元素个数是8

    前言 先声明一下,本文有点标题党了,像我这样的菜鸡何德何能去面试阿里的P7岗啊,不过,这确实是阿里p7级岗位的面试题,当然,参加面试的人不是我,而是我部门的一个大佬.他把自己的面试经验分享给了我,也让 ...

  7. 阿里P8大佬熬夜10天,把所有Android第三方库整理成了PDF

    缘起 随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑.快速迭代的目的越来越难,还有应用之间的互相调用等等问题,插件化技术应用而生.如果没有插件化技术,美团. ...

  8. 身边好几个技术一般的程序员都面上了,阿里P7门槛降低?

    经常在网上的论坛里看到讨论程序员的级别,尤其在跳槽类的信息里可以看到对标阿里P7,百度T6,腾讯3.1等字眼,似乎大厂的级别俨然可以成为业内的通用货币,类似于高考分数一样,哪一档就对应着什么样的待遇. ...

  9. 【简书】在阿里云自带的CentOS + LAMP环境下部署一个Laravel项目

    在阿里云自带的CentOS + LAMP环境下部署一个Laravel项目 作者 DonnieZero 关注 2017.07.29 22:02* 字数 2218 阅读 5556评论 3喜欢 1赞赏 1 ...

随机推荐

  1. 【转载】一次「Too many open files」故障

    一次「Too many open files」故障 发表于2015-08-02 昨天,项目的 ElasticSearch 服务挂了,我说的挂可不是进程没了,因为有 Supervisor 保护,而是服务 ...

  2. Mysql体系结构管理

    1.客户端与服务端模型 1)数据是一个典型的C/S结构的服务 1.mysql自带的客户端工具 mysql mysqladmin mysqldump 3.mysql是一个二进制程序,后台守护进程 单进程 ...

  3. Java核心技术卷阅读随笔--第2章【Java 程序设计环境】

    Java 程序设计环境 本章主要介绍如何安装 Java 开发工具包( JDK ) 以及如何编译和运行不同类型的程序: 控制台程序. 图形化应用程序以及 applet.运行 JDK 工具的方法是在终端窗 ...

  4. 设计模式Copy-on-write

    1.Copy-on-Write 又称COW,写时复制 String的replace()方法,没有修改内部的value数组,而是新创建了一个不可变对象 这种方法在解决不可变对象时,经常使用 这其实就是一 ...

  5. APA自动泊车系统

    APA自动泊车系统 1. 半自动泊车 自动泊车又称为自动泊车入位,它对于新手来说是一项相当便捷的配置,对于老手来说也省了些不少力气.那么自动泊车的原理是什么呢?能想怎么停就怎么停,想停哪儿就停哪儿吗? ...

  6. cuSPARSELt开发NVIDIA Ampere结构化稀疏性

    cuSPARSELt开发NVIDIA Ampere结构化稀疏性 深度神经网络在各种领域(例如计算机视觉,语音识别和自然语言处理)中均具有出色的性能.处理这些神经网络所需的计算能力正在迅速提高,因此有效 ...

  7. GitHub上开源的YOLOv5

    GitHub上开源的YOLOv5 代码地址:https://github.com/ultralytics/YOLOv5 该存储库代表Ultralytics对未来的对象检测方法的开源研究,并结合了我们在 ...

  8. Spring Cloud系列(一):服务注册中心

    一.Spring Cloud简介 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线).分布式系统的协调导致了样 ...

  9. JDBC连接MongoDB

    pom文件中导入驱动 <!-- MongoDB驱动 --> <dependency> <groupId>org.mongodb</groupId> &l ...

  10. springboot静态资源映射规则

    一.所有/webjars/**的请求,都会去classpath:/META-INF/resources/webjars/下的目录去找资源. 二.访问/**,即访问任何资源,如果没有controller ...