极光实时监听怎么调用_源码分析 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,一经查实,立即删除!

相关文章

文字描边_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…

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…

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

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

java settings文件夹_windows下打开.m2文件夹,没有找到setting.xml

Frank作家2018-03-15 10:07已采纳那就自己创建一个手动创建本地仓库的存放路径&#xff0c;例如&#xff1a;D:\Java\m2\repository&#xff1b;在windows的环境变量中增加了新的用户变量M2_REPO&#xff0c;其对应的值为D:\Java\m2\repository(Maven仓库的本地存放路径)&#…

java 播放.pcm文件_如何在浏览器中播放pcm音频

本文记录一点工作经历&#xff0c;探讨音频文件的格式更多访问我的博客前言最近在整理音视频编程的知识&#xff0c;回忆起半年多&#xff0c;有一次需求是在后台播放某来源的 pcm 文件&#xff0c;当时处理方法用了点技巧&#xff0c;记录下来背景&#xff1a;业务需求&#x…

mysql 完全备份恢复吗_mysql完全备份与恢复

备份的重要性&#xff1a;在生产环境中我们数据库可能会遭遇各种各样的不测从而导致数据丢失, 大概分为以下几种.硬件故障软件故障自然灾害误操作 (占比最大)备份类型&#xff1a;物理和逻辑角度&#xff1a;物理备份---指对数据库操作系统的物理文件的备份逻辑备份---指对数据…

scala与java的区别_Scala学习笔记及与Java不同之处总结

Scala与Java具有许多相似之处&#xff0c;但又有许多不同。这里主要从一个Java开发人员的角度&#xff0c;总结在使用Scala的过程中所面临的一些思维转变。这里只是总结了部分两种语言在开发过程中的不同&#xff0c;以后会陆续更新一些切换后在开发过程中值得注意的地方。下面…

centos6.5搭建mysql主从_mysql 主从配置,主-》windows,从-》centos6.5

1.虚拟机配置的主从关系。win7 ip地址192.168.52.102&#xff0c;虚拟机ip 192.168.184.128。docs进入主服务器(master)mysql目录下&#xff0c;添加用户&#xff0c;然后执行mysql>create user dba192.168.184.128 identified by 123456 &#xff0c;然后grant replication…

java 定时关机_「window定时关机命令」电脑定时关机命令,这个方法适用于win7及以下系统 - seo实验室...

window定时关机命令上班族朋友们有没有碰到一种情况&#xff1a;临时需要外出&#xff0c;又不确定是否还要回来&#xff0c;因此办公室的电脑关与不关&#xff0c;小小的纠结了一下。以下方法或者可以帮你化解这个小纠结。定时关机且可以回来时取消(本法适用于 win7及以下系统…

彩票模拟选号程序java_java课程设计-彩票购买抽奖程序

彩票抽奖程序[TOC]###可实现功能&#xff1a;允许注册用户&#xff0c;用户信息包括用户id,用户名&#xff0c;密码&#xff0c;账户金额&#xff0c;电话号码等属性。允许注册用户购买彩票&#xff1a;手动选号、随机选号&#xff0c;并允许设置投注数。抽奖功能&#xff1a;要…

java给你的初步印象_Java之初印象

Java语言的跨平台性:Java语言的编程过程:只要实现了特定平台下的解释器程序(JVM),Java字节码就能通过解释器程序在该平台下运行,这是java跨平台的根本,当前并不是在所有平台下都有相应的Java解释器程序,这也是Java并不是在所有平台下都能运行的原因,它只能在实现了Java解释器程…

php js跨域上传文件,Jquery实现跨域异步上传文件步骤详解

这次给大家带来Jquery实现跨域异步上传文件步骤详解&#xff0c;Jquery实现跨域异步上传文件的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。先说明白这个跨域异步上传功能我们借助了Jquery.form插件&#xff0c;它在异步表单方面很有成效&#xff0c…

php js offset,获取元素的偏移量offset实例详解

问题&#xff1a;如果获取元素距离文档顶部的距离?[javascript] view plain copyvar rect$(#elem)[0].getBoundingClientRect();//获取元素距离文档顶部的距离var toprect.top(window.pageYOffset||document.documentElement.scrollTop)-(document.documentElement.clientTop|…

php 删除上传文件,php实现文件上传、下载和删除的方法

这篇文章主要为大家详细介绍了php文件上传、下载和删除示例,具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下php文件上传、下载和删除示例大体思路如下&#xff0c;具体内容如下一.文件上传1.把上传文件的区域做出来p12.把显示文件的区域做出来p23.提交表单&#…

软件工程详细设计说明书_软件工程导论知识点梳理之简答题

1. 软件危机的表现形式对软件开发成本和进度估计不准确已完成的软件不符合用户需求软件产品质量差&#xff0c;可靠性得不到保证软件产品可维护性差软件成本在计算机总成本中的比例逐渐变大软件开发生产率提高速度比不上计算机应用速度2. 产生软件危机的原因(1)软件是计算机系统…