sentinel源码分析第十五篇一核心流程一样本窗口数据结构

本文介绍了流量控制系统的内部工作原理,包括基于窗口的统计信息存储和更新机制。窗口采用可跳跃和可过期的设计,以优化内存和磁盘资源的使用。MetricNode和LeapArray等核心组件负责数据的读写和存储。同时,文章详细展示了MetricNode的toThinString和toFatString方法,用于HTTP查询响应和磁盘存储的不同格式。通过对源码的分析,揭示了系统如何高效地处理和检索度量信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理图一读写架构

  • Slot槽在内存中负责构建样本窗口的统计信息
  • FlowRuleManager流控规则管理器每一秒将分钟级度量信息写入磁盘
  • 用户可以发起http请求对特定资源某一范围内的度量信息进行查询
  • 其内部根据磁盘文件,通过遍历文件行获取相关信息返回
    在这里插入图片描述

原理图一窗口

  • 度量中包含窗口信息
  • 窗口LeapArray由一个个WindowWrap样本窗口组成
窗口的特点
窗口下标根据计算得出,可跳跃
样本窗口不存在,则只需创建一个新的样本窗口加入相关位置
窗口存在则返回
窗口失效则重置并清空老的窗口,可过期,可占用
  • 所以称窗口是可跳跃可过期窗口

在这里插入图片描述

类名作用
StatisticNode内含度量信息,表示资源的统计信息 主要包含rollingCounterInSecond秒级样本窗口统计信息,rollingCounterInMinute分钟级统计信息,curThreadNum线程计数器信息
Metric度量信息: 封装了对底层样本数据窗口的一系列操作,实现类为ArrayMetric
LeapArray表示样本窗口的特性可跳跃,同时指定了窗口大小 窗口长度等信息OccupiableBucketLeapArray 表示窗口数组中的每一个位置可以被重复使用

窗口信息
AtomicReferenceArray真正的内存存储窗口统计信息在这里插入图片描述
窗口元信息在这里插入图片描述

原理图一窗口的表现形式

WindowWrap的数据类型为MetricBucket

MetricBucket的数据存储在counters内在这里插入图片描述
counters通过序列化得到MetricNode信息输出到磁盘
在这里插入图片描述

源码分析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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值