极光实时监听怎么调用_源码分析 Sentinel 实时数据采集实现原理(图文并茂)

本篇将重点关注 Sentienl 实时数据收集,即 Sentienl 具体是如何收集调用信息,以此来判断是否需要触发限流或熔断。

Sentienl 实时数据收集的入口类为 StatisticSlot。

我们先简单来看一下 StatisticSlot 该类的注释,来看一下该类的整体定位。

StatisticSlot,专用于实时统计的 slot。在进入一个资源时,在执行 Sentienl 的处理链条中会进入到该 slot 中,需要完成如下计算任务:

  • 集群维度计算资源的总统计信息,用于集群限流,后续文章将详细探讨。
  • 来自不同调用方/来源的群集节点的统计信息。
  • 特定调用上下文环境的统计信息。
  • 统计所有入口的统计信息。

接下来用源码分析的手段来详细分析 StatisticSlot 的实现原理。

1、源码分析 StatisticSlot

1.1 StatisticSlot entry 详解

StatisticSlot#entry

cddf1f875b82fa6efb79f60b3ed42d11.png

StatisticSlot#entry

d3db4f8d091db33b4e57d40a306ab06d.png

StatisticSlot#entry

c3b41d2765d0054678fbceb1669f87f8.png

StatisticSlot#entry

代码@1:首先调用 fireEntry,先调用 Sentinel Slot Chain 中其他的处理器,执行完其他处理器的逻辑,例如 FlowSlot、DegradeSlot,因为 StatisticSlot 的职责是收集统计信息。

代码@2:如果后续处理器成功执行,则将正在执行线程数统计指标加一,并将通过的请求数量指标增加对应的值。下文会对 Sentinel Node 体系进行详细的介绍,在 Sentinel 中使用 Node 来表示调用链中的某一个节点,每个节点关联一个资源,资源的实时统计信息就存储在 Node 中,故该部分也是调用 DefaultNode 的相关方法来改变线程数等,将在下文会向详细介绍。

代码@3:如果上下文环境中保存了调用的源头(调用方)的节点信息不为空,则更新该节点的统计数据:线程数与通过数量。

代码@4:如果资源的进入类型为 EntryType.IN,表示入站流量,更新入站全局统计数据(集群范围 ClusterNode)。

代码@5:执行注册的进入Handler,可以通过 StatisticSlotCallbackRegistry 的 addEntryCallback 注册相关监听器。

代码@6:如果捕获到 PriorityWaitException ,则认为是等待过一定时间,但最终还是算通过,只需增加线程的个数,但无需增加节点通过的数量,具体原因我们在详细分析限流部分时会重点讨论,也会再次阐述 PriorityWaitException 的含义。

代码@7:如果捕获到 BlockException,则主要增加阻塞的数量。

代码@8:如果是系统异常,则增加异常数量。

我想上面的代码应该不难理解,但涉及到统计指标数据的变化,都是调用 DefaultNode node 相关的方法,从这里也可以看出,Node 将是实时统计数据的直接持有者,那毋容置疑接下来将重点来学习 Node,为了知识体系的完备性,我们先来看一下 StatisticSlot 的 exit 方法。

1.2 StatisticSlot exit 详解

51d076278a67d08677b257d933f1d499.png

StatisticSlot#exit

代码@1:成功执行,则重点关注响应时间,其实现亮点如下:

  • 计算本次响应时间,将本次响应时间收集到 Node 中。
  • 将当前活跃线程数减一。

代码@2:执行退出时的 callback。可以通过 StatisticSlotCallbackRegistry 的 addExitCallback 方法添加退出回调函数。

代码@3:传播 exit 事件。

接下来我们将重点介绍 DefaultNode,即 Sentinel 的 Node 体系,持有资源的实时调用信息。

2、Sentienl Node 体系

2.1 Node 类体系图

1cd535f3a020b17fe50cfa68635a55ff.png

我们先简单介绍一下上述核心类的作用与核心接口或核心属性的含义。

  • OccupySupport
    支持抢占未来的时间窗口,有点类似借用“未来”的令牌。其核心方法如下:
    1)long tryOccupyNext(long currentTime, int acquireCount, double threshold)
    尝试抢占未来的令牌,返回值为调用该方法的线程应该 sleep 的时间。
    1、long currentTime
    当前时间。
    2、int acquireCount
    本次需要申请的令牌个数。
    3、double threshold
    设置的阔值。
    2)long waiting()
    获取当前已申请的未来的令牌的个数。
    3)void addWaitingRequest(long futureTime, int acquireCount)
    申请未来时间窗口中的令牌。
    4)void addOccupiedPass(int acquireCount)
    增加申请未来令牌通过的个数。
    5)double occupiedPassQps()
    当前抢占未来令牌的QPS。
  • Node
    持有实时统计信息的节点。定义了收集统计信息与获取统计信息的接口,上面方法根据方法名称即可得知其含义,故这里就不一一罗列了。
  • StatisticNode
    实现统计信息的默认实现类。
  • DefaultNode
    用于在特定上下文环境中保存某一个资源的实时统计信息。
  • ClusterNode
    实现基于集群限流模式的节点,将在集群限流模式部分详细介绍。
  • EntranceNode
    用来表示调用链入口的节点信息。

本文将详细介绍 DefaultNode 与 StatisticNode,重点阐述调用树与实时统计信息。DefaultNode 是 StatisticNode 的子类,我们先从 StatisticNode 开始 Node 体系的探究。

3、StatisticNode 详解

3.1 核心类图

9b48dce6bf41239d1c519d85050489e9.png

我们对其核心属性进行一一解读:

  • Metric rollingCounterInSecond = new ArrayMetric(SampleCountProperty.SAMPLE_COUNT, IntervalProperty.INTERVAL)
    每秒的实时统计信息,使用 ArrayMetric 实现,即基于滑动窗口实现,正是上篇文章详细介绍的,默认1s 采样 2次。即一个统计周期中包含两个滑动窗口。
  • Metric rollingCounterInMinute = new ArrayMetric(60, 60 * 1000, false)
    每分钟实时统计信息,同样使用 ArrayMetric 实现,即基于滑动窗口实现。每1分钟,抽样60次,即包含60个滑动窗口,每一个窗口的时间间隔为 1s 。
  • LongAdder curThreadNum = new LongAdder()
    当前线程计数器。
  • long lastFetchTime = -1
    上一次获取资源的有效统计数据的时间,即调用 Node 的 metrics() 方法的时间。

关于 ArrayMetric 滑动窗口设计与实现原理,请参考笔者的另一篇博文:源码分析 Alibaba sentinel 滑动窗口实现原理(文末附原理图)

接下来我们挑选几个具有代表性的方法进行探究。

2.2 addPassRequest

4a6d496a75323c98c104c36ed52d4c4c.png

增加通过请求数量。即将实时调用信息向滑动窗口中进行统计。addPassRequest 即报告成功的通过数量。就是分别调用 秒级、分钟即对应的滑动窗口中添加数量,然后限流规则、熔断规则将基于滑动窗口中的值进行计算。

2.3 totalRequest

498800bb8f185a186eefe958d0c12405.png

获取当前时间戳的总请求数,获取分钟级时间窗口中的统计信息。

2.4 successQps

470e962462ce169653fc5f95f96a20a9.png

成功TPS,用秒级统计滑动窗口中统计的个数 除以 窗口的间隔得出其 tps,即抽样个数越大,其统计越精确。

温馨提示:上面的方法在学习了上文的滑动窗口设计原理后将显得非常简单,大家在学习的过程中,可以总结出一个规律,什么时候时候使用秒级滑动窗口,什么时候使用分钟级滑动窗口。

2.5 metrics

由于 Sentienl 基于滑动窗口来实时收集统计信息,并存储在内存中,并随着时间的推移,旧的滑动窗口将失效,故需要提供一个方法,及时将所有的统计信息进行汇总输出,供监控客户端定时拉取,转储都其他客户端,例如数据库,方便监控数据的可视化,这也通常是中间件用于监控指标的监控与采集的通用设计方法。

b1d98579c1263254d788c024b6604def.png

代码@1:获取当前时间对应的滑动窗口的开始时间,可以对比上文计算滑动窗口的算法。

代码@2:获取一分钟内的所有滑动窗口中的统计数据,使用 MetricNode 表示。

代码@3:遍历所有节点,刷选出不是当前滑动窗口外的所有数据。这里的重点是方法:isNodeInTime。

abd96595280f9565c27681bbc0464456.png

这里只刷选出不是当前窗口的数据,即 metrics 方法返回的是“过去”的统计数据。

接下来我们再来看看 DefaultNode 相关的几个特性方法。

4、DefaultNode 详解

4.1 类图

82c2a23f668a9a34d71869dc57d2cb20.png

DefaultNode 是 StatisticNode 的子类,其额外增加的属性如下:

  • private ResourceWrapper id
    资源id,即 DefaultNode 才真正与资源挂钩,可以将 DefaultNode 看出是调用链中的一个节点,并且与资源关联。
  • private volatile Set< Node > childList
    子节点结合。以此来维持其调用链。
  • private ClusterNode clusterNode
    集群节点,同样为 StatisticNode 的子类,表示与资源集群相关的环境。

接下来我们将来看一下 DefaultNode 的核心方法。

4.2 increaseBlockQps

4b3b62ffa4a33848d0d56d7fb32a7853.png

DefaultNode 的此类方法,通常是先调用 StatisticNode 的方法,然后再调用 clusterNode 的相关方法,最终就是使用在对应的滑动窗口中增加或减少计量值。

其他方法也比较简单,就不再细看了,我们可以通过 DefaultNode 的 printDefaultNode 方法来打印该节点的调用链。

本文就介绍到这里了,本文详细介绍了 Sentinel 实时数据收集的统一入口 StatisticSlot,并且介绍了 Seninel Node 体系,即调用链中的每一个节点,每一个节点对一个资源的实时统计信息。下一篇将开始重点限流是如何实现的,即 FlowSlot 的实现技巧。


源码分析 Sentinel 系列专栏连载中,已发表目录:

1、Sentinel 限流与熔断初探(技巧篇)

2、滑动窗口实现原理(文末附原理图)

3、寻找一把 Sentinel 的钥匙

4、调用上下文环境实现原理(图文并茂)

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

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

相关文章

awd赛题的flag是什么意思_网上说的“立flag”是什么意思?

展开全部如果你是一个经常混进b站的人的话&#xff0c;那你就会发现32313133353236313431303231363533e58685e5aeb931333363366233经常有人说出立了个flag或者是flag已立&#xff0c;那么这立flag是什么意思&#xff1f;立flag是什么梗&#xff1a;立flag指的是明确一件事情的结…

python股票网格交易法详解_股票最全“低买高卖”网格交易大法,值得收藏!

网格交易法&#xff0c;可以简单理解为在既定网格中实行“跌买涨卖”。首先需要制定一个【网格系统】&#xff0c;主要包括网格格数、网格密度、最大压力价格和最小支撑价格四大要素。当标的价格跌破一个网格密度时&#xff0c;就买入相应的仓数&#xff0c;每涨破一个网格密度…

python命令行tab补全_python命令行下按tab建补全的方法

此方法只在centos6上测试通过&#xff0c;其它系统木有测试1、在用户家目录下创建一个名字叫 .pythonstartup 的隐藏文件&#xff0c;写入如下内容&#xff1a;# python startup fileimport readlineimport rlcompleterimport atexitimport os# tab completionreadline.parse_a…

文字描边_6招迅速做出炫酷PPT字效!|10分钟干货第二期(文字描边)

不点蓝字&#xff0c;我们哪来故事&#xff1f;艺术让一切枯燥变有趣 作者 | 易焦躁星人微信号 | wyx19911003每周一篇&#xff0c;干货满满建议收藏&#xff0c;慢慢实践PPT酷炫【字效】第二弹来啦&#xff01;平时做PPT无从下手没灵感&#xff1f;根本原因还对功能实践的不够…

华为手机鸿蒙系统怎么样_华为自研操作系统“鸿蒙”已用于华为手机

重要信息有网友近日在社交网络上曝光了华为的自研操作系统&#xff0c;命名为“鸿蒙”&#xff0c;其已用于华为手机中(安全部分)。来自上海交通大学的一份PPT演示照片&#xff0c;图中显示&#xff0c;某教授领导华为操作系统团队开发了自主产权操作系统——鸿蒙。根据PPT描述…

chrome浏览器上传文件延迟_解决谷歌Chrome浏览器上传图片反应慢的办法

谷歌chrome浏览器本来非常好用&#xff0c;但是可能有的人在更新版本或重装电脑后&#xff0c;用着用着突然发现上传图片或文件的时候居然直接卡死!只能强制关闭后用ie上传&#xff0c;为此笔者也一度很苦恼。笔者在网上搜索答案后&#xff0c;并没有得到有效的帮助&#xff0c…

mysql配置两个猪数据库_Linux下安装启动多个Mysql

步骤如下&#xff1a;一、编译安装两个mysql&#xff0c;步骤如下安装第一个数据库(主数据库)(红色部分为默认数据库文件路径&#xff0c;可改成其他如&#xff1a;data、var等)tar zxvf mysql-6.0.11-alpha.tar.gzcd mysql-6.0.11-alpha./configure --prefix/usr/local/mysql3…

linux 两个mysql_Linux下安装两个MySQL的方法

问题的产生&#xff1a;在已有的Red Hat Enterprise Linux AS 3.0系统上已经运行了一套web程序&#xff0c;使用MySQL4, tomcat41, 现在又要求安装一套新程序&#xff0c;依旧使用该tomcat41, 但数据库变为mysql5。注意事项&#xff1a;新的程序需要注意字符集的问题&#xff0…

mysql启动卡死_mysql无法启动服务,mysql卡死解决办法

今天在用mysql的innodb引擎时突然出现InnoDB registration as a STORAGE ENGINE failed.Unknown/unsupported table type: innodb.系统变得无法正常启动了&#xff0c;经过分析做个记录以借再次碰到此类问题的同学参考。前几天&#xff0c;启动时&#xff0c;突然报1067系统错误…

ef mysql db first_Net Core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后&#xff0c;不能像以前一样直接在新建项中添加ef了&#xff0c;需要用命令在添加ef的依赖二.使用Nuget添加EF的依赖输入命令: Install-Package Microsoft.EntityFrameworkCore.SqlServer安装成功后就可以在依赖项中看到注意执行命令…

kali装电脑_教你Kali Linux怎么安装Nessus软件

Nessus是系统漏洞扫描与分析软件&#xff0c;但Nessus在Kali Linux上的安装可不简单&#xff0c;没有提供一个图形化的安装借口&#xff0c;下面小编就给大家介绍下如何在Kali Linux上安装Nessus。用w3m命令在终端下打开http://www.tenable.com/products/nessus/select-your-op…

mysql创建表属性引_【学习之Mysql数据库】mysql数据库创建表的属性详解

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼MySQL中create table语句的基本语法是&#xff1a;CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement]TEMPORARY&#xff1a;该关键字表示用MySQL create table新建…

vue中src文件夹下各文件_Win10下与虚拟机中的linux共享文件夹

Win10主机和Vmware linux共享文件夹1.首先确保虚拟机中的linux能ping通主机&#xff0c;证明虚拟机是可以访问到的主机的(这个不会可百度)2.右击你想要共享的文件夹选择属性&#xff0c;点击共享&#xff0c;同时加入一个everyone用户&#xff0c;权限为读取/写入3.然后点击高级…

asp.net mysql 中文乱码_mysql4导入mysql5中文乱码问题

数据库里存储的数据的编码似乎和表的编码类型无关。如果你的网页编码类型为utf-8&#xff0c;而且是用mysqldump导出的话&#xff0c;在create table 后面会有一句DEFAULT CHARSETlatin1;把这句话改成DEFAULT CHARSETutf8;一般在数据库中就不会乱码了。在mysql数据库中导出数据…

链表的基本操作 java_Java_实现单链表-基本操作

1 packageofficeCoding;23 importjava.util.ArrayList;4 importjava.util.Stack;56 /**7 * 从尾到头遍历链表 输入一个链表&#xff0c;按链表值从尾到头的顺序返回一个ArrayList8 *9 *authorAdministrator10 */11 class ListNode {//单链表节点构建12 intval;13 ListNode next…

java 不同包_Java项目中不同包的命名及作用

①在vo或者domain包中定义bean类&#xff0c;主要是类的属性&#xff0c;这个类跟数据库中的某个表的字段一致。②dao包中主要是存放用于操作数据库完成业务逻辑方法的接口。③dao.impl这个包存放着这样的一个类&#xff0c;这个类主要是实现dao中定义的方法&#xff0c;完成具…

java项目怎么导出成jar_如何在eclipse将程序导出成jar文件

在编写好的java包上右键--export。下面是简单的一个java小程序&#xff0c;可以用来做测试public class Main { public static void main(String[] args) { JFrame frame new JFrame(); JPanel panel new JPanel(); JTextArea textArea new JTextAr…

java门槛_Java的入行门槛高吗?对学历有限制吗?

学习Java的热潮越来越高涨&#xff0c;除了转行而来的人&#xff0c;很多刚毕业的学生也加入到其中。很多人都觉得学习Java需要有一个高学历作为基础&#xff0c;一些专科生在学习之前会犹豫&#xff0c;他们是否能学习Java&#xff1f;学历会成为他们学习Java的限制吗&#xf…

grade java_Gradle Java 构建入门

Java 构建入门Java 插件如你所见&#xff0c;Gradle 是一个通用工具。它可以通过脚本构建任何你想要实现的东西&#xff0c;真正实现开箱即用。但前提是你需要在脚本中编写好代码才行。大部分 Java 项目基本流程都是相似的&#xff1a;编译源文件&#xff0c;进行单元测试&…

java 小数处理_java 小数点处理

public class Test {public static void main(String[] args) {double i 3.856;// 舍掉小数取整System.out.println("舍掉小数取整:Math.floor(3.856)" (int) Math.floor(i));// 四舍五入取整System.out.println("四舍五入取整:(3.856)" new BigDecimal(…