【RuoYi-Cloud-Plus】学习笔记 06 - Sentinel(一)关于 StatisticSlot 以及 LeapArray

news2025/1/26 13:47:09

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1、Sentinel 简介
      • 2、Sentinel 架构图
      • 3、Sentinel 源码学习
      • 3.1、包结构
      • 3.2、 `LeapArray` (滑动窗口算法的实现)
      • 3.3、`StatisticSlot`
      • 3.3.1、`StatisticSlot#entry`
      • 3.3.2、`StatisticSlot#exit`
      • 3.4、`StatisticNode`、`StatisticSlot`、`ArrayMetric`、`LeapArray`

前言

最近需要整理框架的知识点,Cloud 专栏好长时间不更新了,今天浅学了一下 Sentinel,主要看了一下关于滑动窗口 Sliding Window 的底层数据结构 LeapArray 源码,再补充看了一下 StatisticSlot。虽然本文没有涉及到框架的内容,主要是对于源码的逻辑分析理解,但还是整理到 Cloud 专栏里面以便后续学习。

参考目录

  • Sentinel 官方文档
  • Sentinel 核心类解析
    强烈建议读一下该文档,对 Sentinel 核心结构有一个大致的理解。

学习笔记

1、Sentinel 简介

首先还是简单介绍一下 Sentinel(搬运自官方文档):

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

2、Sentinel 架构图

总体架构图(搬运自官方文档):
在这里插入图片描述

Sentinel 的核心骨架,将不同的 Slot 按照顺序串在一起(责任链模式),从而将不同的功能(限流、降级、系统保护)组合在一起。slot chain 其实可以分为两部分:统计数据构建部分(statistic)和判断部分(rule checking)。

在整理消化这个架构图时,看到了关于监控统计的介绍:
在这里插入图片描述

Sentinel 底层采用高性能的滑动窗口数据结构 LeapArray 来统计实时的秒级指标数据,可以很好地支撑写多于读的高并发场景。

这个滑动窗口实际上就是架构图右上角 Sliding Window 所表示的结构,但是一眼看下去还是不太能看懂,所以不妨去问一下 ChatGPT 以及看看源码。

3、Sentinel 源码学习

3.1、包结构

在这里插入图片描述

包里面重点的几个类:

  • LeapArray
  • ArrayMetric
  • StatisticSlot

由前面的介绍可知,LeapArray 属于底层的滑动窗口数据结构,所以先从这个入手理解一下。

3.2、 LeapArray (滑动窗口算法的实现)

在这里插入图片描述

从类的注释可以知道,LeapArray 是统计实现的底层数据结构,使用的是 滑动窗口算法 Sliding Window 来对数据进行统计。

简单来说,滑动窗口将一段时间间隔(intervalInMs)划分成了由 N个(sampleCount)桶(Bucket)组成的时间片数组,每个桶的时间长度是 windowLengthInMs,桶里面保存了统计的相关数据。

下面来看下滑动窗口的核心方法。

LeapArray#currentWindow
在这里插入图片描述

该方法的主要作用是通过时间戳获取到当前滑动窗口桶中的统计信息。该方法的注释也非常详细,下面简单说明一下。

  1. 首先,判断传入的 timeMillis 参数是否小于 0,如果小于 0,则返回 null
  2. 接着,根据时间参数 timeMillis,计算出对应的时间桶索引 idx 和时间窗口的起始时间 windowStart
  3. 然后,使用 while(true) 实现一个无限循环,用来获取桶,即特定时间段内的统计信息。

获取桶一般有以下三种情况:

  • 情况一:缺少桶,需要创建新桶并更新到数组
  • 情况二:最新桶,直接返回
  • 情况三:桶被丢弃,需要重置

情况一:
判断当前时间段的桶是否存在,如果不存在,则创建一个新的桶,并尝试使用 CAS 操作将其更新到滑动窗口的桶数组中,如果更新成功,则返回新的桶。

在这里插入图片描述

CAS操作:
在这里插入图片描述

情况二:
如果桶已经存在,并且与当前时间段的起始时间相同,则说明这个桶是最新的,可以直接返回。

在这里插入图片描述

情况三:
如果桶已经存在,但其起始时间已经过期,则需要更新这个桶。此时,需要使用 updateLock 锁来进行同步,防止多个线程同时更新桶的情况。

在这里插入图片描述

最后,如果时间参数早于桶的起始时间,则创建一个新的空桶并返回。(正常情况下不会进入这个判断,因为提供的时间总会早于当前时间)

关于滑动窗口的优点:
在这里插入图片描述

3.3、StatisticSlot

在这里插入图片描述

StatisticSlot 是 Sentinel 最为重要的类之一,用于根据规则判断结果进行相应的统计操作。

entry 的时候:依次执行后面的判断 slot。每个 slot 触发流控的话会抛出异常(BlockException 的子类)。若有 BlockException 抛出,则记录 block 数据;若无异常抛出则算作可通过(pass),记录 pass 数据。

exit 的时候:若无 error(无论是业务异常还是流控异常),记录 complete(success)以及 RT,线程数-1。

记录数据的维度:线程数+1、记录当前 DefaultNode 数据、记录对应的 originNode 数据(若存在 origin)、累计 IN 统计数据(若流量类型为 IN)。

文档简单介绍了 StatisticSlot 类中的方法。

3.3.1、StatisticSlot#entry

在这里插入图片描述

主要方法逻辑:

  1. 调用 fireEntry 方法进行校验,以确保进入当前资源的请求数量不超过限制。
  2. 增加当前节点的线程数和通过请求数。
  3. 如果当前节点有 originNode,也将增加其线程数和通过请求数。
  4. 如果当前节点是 EntryType.IN 类型,则增加全局入口节点的线程数和通过请求数。
  5. 最后,调用注册的 Entry 回调函数,处理通过事件。

异常处理:

  • 优先级等待异常(PriorityWaitException
  • 阻塞异常(BlockException

在这里插入图片描述

当出现优先级等待异常时,增加当前节点和 originNode 的线程数,并调用注册的 Entry 回调函数处理通过事件。

当出现阻塞异常时,设置当前入口节点的阻塞异常,并增加当前节点和 originNode 的阻塞请求次数、总阻塞时间,并调用注册的 Entry 回调函数处理阻塞事件,最后抛出 BlockException 异常。

3.3.2、StatisticSlot#exit

在这里插入图片描述

主要方法逻辑:

  1. 计算响应时间 RT
  2. 使用 RT 来记录成功计数和响应时间
  3. 执行已注册的 ExitCallback 处理程序
  4. 调用 fireExit 函数

3.4、StatisticNodeStatisticSlotArrayMetricLeapArray

最后来简单总结一下这几个类的关系。

当 Sentinel 监控系统对某个资源进行监控时,会创建一个对应的 StatisticNode 节点,该节点通过 StatisticSlot 统计槽收集和处理数据,并通过 ArrayMetric 数组度量器来维护收集的数据。LeapArray 则相当于一个滑动时间窗口,用于按照时间周期将各个 ArrayMetric 链接起来,以形成一个时间线的统计图。

ArrayMetric
在这里插入图片描述

StatisticNode
在这里插入图片描述

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux——基础网络设置

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。 个人主页:小李会科技的…

几个事件的问题

1.PC端的click是点击事件,移动端的lick会存在300ms延迟 移动端的click是单击事件,单击事件:第一次点击后,监测300ms, 看是否有第二次点击操作,如果有就是单击,如果有就是双击。 如何解决: 单手指事件模型…

Linux 操作系统原理 — tc 流量控制技术解析

目录 文章目录 目录Traffic ControlTraffic Control 的基本实现原理流量处理的三个层面流量处理的关键流程流量队列的类型FIFO 队列PFIFO_FAST 队列SFQ 队列令牌桶队列 Kernel Traffic Control 的工作原理Qdisc(队列描述)Class(分类&#xff…

电子元器件解析之电容(二)——电容分类与应用场景

书接上文:电子元器件解析之电容(一)——定义与性能参数:https://blog.csdn.net/weixin_42837669/article/details/131142286 摘要 本文总结了各种不同介质电容的特性,包括陶瓷电容、电解电容、薄膜电容等;同时对一些特殊场合的电容…

Transformer Block运算量

参考:Swin Transformer论文精读【论文精读】_哔哩哔哩_bilibili 在看朱毅老师讲解Swin Transformer论文时,里面有一个Transformer Block的计算复杂度的推导计算,感觉清晰明了,这里做一下记录,先说一下结果,…

Android:Handler

参考来源 参考来源 参考来源 参考来源 Handler机制(面试版) Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信 handler机制是android系统运行的基础,它采用生产者,消费者模式进行设计。其中生产…

基于SSM的青少年编程学习系统设计与实现

摘 要:在智能技术飞速发展的今天,各国都努力争取在人工智能时代的发展中占据优势,青 少年编程教育就显得格外重要。不过,相比一些青少年编程教育发展更先进的国家,我国青少 年编程教育仍处在初级阶段,很多青…

服务器(裸机)如何安装Centos 7系统

1. 下载系统镜像(可以选择自己对应的版本) http://mirrors.aliyun.com/centos/7/isos/x86_64/2. 制作linux系统U盘 下载UltraISO制作工具并安装 再准备一个空U盘(注意:这个操作会将U盘内数据全部删除操作之前请将U盘内文件备份&…

Swift学习笔记(一)基础语法

文章目录 前言开发工具变量与常量变量和常量的定义和使用变量和常量的命名规范注释初识基本数据类型浮点型数据布尔型数据两种特殊的基本数据类型元组可选值类型 为类型取别名模拟面试 字符、字符串与集合类型字符串类型字符串的组合字符类型转义字符 字符串类型中的常用方法集…

Redis的大key

什么是 redis 的大 key redis 的大 key 不是指存储在 redis 中的某个 key 的大小超过一定的阈值,而是该 key 所对应的 value 过大对于 string 类型来说,一般情况下超过 10KB 则认为是大 key;对于set、zset、hash 等类型来说,一般…

K8s in Action 阅读笔记——【13】Securing cluster nodes and the network

K8s in Action 阅读笔记——【13】Securing cluster nodes and the network 13.1 Using the host node’s namespaces in a pod Pod中的容器通常在不同的Linux名称空间下运行,这使得它们的进程与其他容器或节点默认名称空间下运行的进程隔离开来。 例如&#xff…

初学Nginx要掌握哪些概念

文章目录 为什么要使用Nginx?什么是Nginx?Nginx的作用?反向代理负载均衡动静分离 为什么要使用Nginx? 小公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个…

Android 逆向安全行业前景如何?

前言 Android 逆向是指对已经发布的 Android 应用进行分析和研究,通过逆向工程,将 Android 应用中的底层实现原理、业务逻辑、源代码以及恶意行为等等信息进行破解和掌握。逆向工程可以让研究者深入了解 Android 应用的实现细节,从而识别和修…

算法刷题-数组-螺旋矩阵

59.螺旋矩阵 力扣题目链接 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 思路 这道题目可以说在面试中出现频率较高的题目&#x…

3.DIY可视化-拖拽设计1天搞定主流小程序-前后分离框架运行

3.DIY可视化-拖拽设计1天搞定主流小程序-前后分离框架运行 前言 话不多说,直接实操。一、导入 diygw-ui-admin项目到vscode 克隆项目 : git clone https://gitee.com/diygw/diygw-ui-admin.git进入项目 桌面 cmd 运行: cd diygw-ui-admin推荐使用yarn 也可参照后面直接使用npm…

react合成事件+底层原理+发展历程

React中的合成事件 合成事件是围绕浏览器原生事件,充当跨浏览器包装器的对象;它们将不同浏览器的行为合并为一个API,这样做是为了确保事件在不同浏览器中显示一致的属性!保证兼容性 合成事件的基本操作 基础语法:在JSX元素上,直…

2023蓝桥杯大学A组C++决赛游记+个人题解

Day0 发烧了一晚上没睡着,感觉鼻子被打火机烧烤一样难受,心情烦躁 早上6点起来吃了个早饭,思考能力完全丧失了,开始看此花亭奇谭 看了六集,准备复习数据结构考试,然后秒睡 一睁眼就是下午2点了 挂了个…

交通 | GAMS快速入门及其在运输问题求解的应用

推文作者​:AmieeXue 第一部分 GAMS编程求解运输问题 GAMS,全称The General Algebraic Modeling System,是一款通用的高级数学建模工具,它支持线性规划、非线性规划、混合整数规划问题、二次约束规划(QCP)…

《面试1v1》List

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 《面试1v1》 连载中… 面试官: 小伙子,听说你对Java集合挺在行的? 候选人: 谢谢夸奖,我对Java集合还在学习中,只能算入门水平。特别是List这…

vue 3 第三十五章:集成 tailwind Css

文章目录 1. tailWind css介绍2. tailWind css基本使用2.1. 步骤一:安装Tailwind CSS2.2. 步骤二:创建配置文件2.3. 步骤三:配置PostCSS2.4. 步骤四:引入样式文件2.5. 步骤五:模板中使用tailWind css 3. 补充3.1. 语法…