文章目录
- 原理图一读写架构
- 原理图一窗口
- 原理图一窗口的表现形式
- 源码分析MetricNode一toThinString
- 源码分析MetricNode一toFatString
- 总结
- FatString一thinString
原理图一读写架构
- Slot槽在内存中负责构建样本窗口的统计信息
- FlowRuleManager流控规则管理器每一秒将分钟级度量信息写入磁盘
- 用户可以发起http请求对特定资源某一范围内的度量信息进行查询
- 其内部根据磁盘文件,通过遍历文件行获取相关信息返回
原理图一窗口
- 度量中包含窗口信息
- 窗口LeapArray由一个个WindowWrap样本窗口组成
窗口的特点 |
窗口下标根据计算得出,可跳跃 |
样本窗口不存在,则只需创建一个新的样本窗口加入相关位置 |
窗口存在则返回 |
窗口失效则重置并清空老的窗口,可过期,可占用 |
- 所以称窗口是可跳跃可过期窗口
类名 | 作用 |
StatisticNode | 内含度量信息,表示资源的统计信息 主要包含rollingCounterInSecond秒级样本窗口统计信息,rollingCounterInMinute分钟级统计信息,curThreadNum线程计数器信息 |
Metric | 度量信息: 封装了对底层样本数据窗口的一系列操作,实现类为ArrayMetric |
LeapArray | 表示样本窗口的特性可跳跃,同时指定了窗口大小 窗口长度等信息OccupiableBucketLeapArray 表示窗口数组中的每一个位置可以被重复使用 |
WindowWrap的数据类型为MetricBucket
源码分析MetricNode一toThinString
- 客户端查询返回如下信息
timestamp|resource|passQps|blockQps|successQps|exceptionQps|rt|occupiedPassQps
public static MetricNode fromThinString(String line) {
MetricNode node = new MetricNode();
String[] strs = line.split("\\|");
node.setTimestamp(Long.parseLong(strs[0]));
node.setResource(strs[1]);
node.setPassQps(Long.parseLong(strs[2]));
node.setBlockQps(Long.parseLong(strs[3]));
node.setSuccessQps(Long.parseLong(strs[4]));
node.setExceptionQps(Long.parseLong(strs[5]));
node.setRt(Long.parseLong(strs[6]));
if (strs.length >= 8) {
node.setOccupiedPassQps(Long.parseLong(strs[7]));
}
if (strs.length >= 9) {
node.setConcurrency(Integer.parseInt(strs[8]));
}
if (strs.length == 10) {
node.setClassification(Integer.parseInt(strs[9]));
}
return node;
}
源码分析MetricNode一toFatString
- 其在文件中以如下格式存储
timestamp|yyyy-MM-dd HH:mm:ss|resource|passQps|blockQps|successQps|exceptionQps|rt|occupiedPassQps\n
public String toFatString() {总结
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
StringBuilder sb = new StringBuilder(32);
sb.delete(0, sb.length());
sb.append(getTimestamp()).append("|");
sb.append(df.format(new Date(getTimestamp()))).append("|");
String legalName = getResource().replaceAll("\\|", "_");
sb.append(legalName).append("|");
sb.append(getPassQps()).append("|");
sb.append(getBlockQps()).append("|");
sb.append(getSuccessQps()).append("|");
sb.append(getExceptionQps()).append("|");
sb.append(getRt()).append("|");
sb.append(getOccupiedPassQps()).append("|");
sb.append(concurrency).append("|");
sb.append(classification);
sb.append('\n');
return sb.toString();
}
- 样本窗口存在两个维度,分钟级和秒级
- 存在调度每秒将分钟级内存窗口写入磁盘
- 写入格式为FatString
- 用户可以通过http请求查询,查询格式为thinString
FatString一thinString
- timestamp|yyyy-MM-dd HH:mm:ss|resource|passQps|blockQps|successQps|exceptionQps|rt|occupiedPassQps
- timestamp|resource|passQps|blockQps|successQps|exceptionQps|rt|occupiedPassQps