Sentinel源码剖析----滑动窗口

  之前说过Sentinel外部统计应用Node来停止处理,而Node底层是应用滑动窗口完成的,这篇文章主要剖析一下滑动窗口的完成。

  以方法为进口,先看看外部完成:

  方法外部调用了和,看了下两个变量的声明,可以看到类型都是,只不外参数纷歧样,而从变量名来看,一个是统计一分钟的数据,一个是统计一秒钟的数据

  那么看看ArrayMetric是甚么器械,结构方法和成员变量以下

  外部只要一个类型,仿佛又将统计的义务拜托给了,抽两个方法看看其完成:

  确实是中间完成是在中,这里只做一层转发、汇总

  接着继续看下完成

  貌似也只是重写下场部方法,中间逻辑在父类中,父类结构方法以下:

  留心:后续没有特别说明,时间窗口都指小窗口

  那么从方法末尾剖析,方法外部起首调用方法获得了以后时间窗口,完成以下:

  留心:

  这个比拟复杂,举个栗子就可以明确了,认为例,该方法掉掉落的值以下:

  因为数组长度为2,那么最后取余后,掉掉落的结果只能是0或许1,这里掉掉落的是1

  这个也比拟复杂,画个图就明确了

  在这里拔出图片刻画

  timeMillis表现以后时间739,从图下去看他属于1号窗口,而如何计算以后窗口的末尾时间呢,那么就是

  739-239=739-739%500=500

  获得以后窗口的代码下面曾经具体的注释了,然则这个器械不画图是比拟难了解的,而作为一名"魂魄画手"不画图如何行

  窗口初始形状以下:

  image.png

  虚线表现以后两个窗口,即数组是空的,这时候分履行第一个分主流程即以后,掉掉落的窗口以下(完成表现窗口曾经有值),假定以后时间求得的下标为0,那么0这个窗口会初始化

  image.png

  这时候分,窗口0曾经有值,窗口末尾时间为0,假定又有恳求过去,以后时间为750,计算掉掉落的下标为1,因为1这个位置未初始化,那么停止初始化后,时间窗口以下:

  image.png