sentinel源码分析-08流量数据统计

利用MATLAB 4f光学系统,在Python中进行弗劳恩霍夫衍射和傅里叶面滤波——用镜头模拟光学图像处理。.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载

流量数据统计

上面我说了各种流控规则如何进行限流,那这个流量数据是如何统计出来的呢?这里我们回到StatisticNode

//每秒统计数据
private transient volatile Metric rollingCounterInSecond = new ArrayMetric(SampleCountProperty.SAMPLE_COUNT,
    IntervalProperty.INTERVAL);

/**
 * Holds statistics of the recent 60 seconds. The windowLengthInMs is deliberately set to 1000 milliseconds,
 * meaning each bucket per second, in this way we can get accurate statistics of each second.
 */
//每分钟统计数据
private transient Metric rollingCounterInMinute = new ArrayMetric(60, 60 * 1000, false);

/**
 * The counter for thread count.
 */
//线程总数
private AtomicInteger curThreadNum = new AtomicInteger(0);

我们可以看到统计节点主要是保存三种实时统计指标,每秒统计信息、每分钟的统计信息、并发线程数

Metric接口定义了获取各种统计信息的方法,如

long success();
long block();
long exception();
long pass();
long rt();
......

ArrayMetric底层又是通过LeapArray来完成数据的统计,其中几个重要的属性

protected int windowLengthInMs;//每个窗口时间长度
protected int sampleCount;//时间窗口个数
protected int intervalInMs;//总的间隔时间
protected final AtomicReferenceArray<WindowWrap<T>> array;//存放时间窗口的集合

 public LeapArray(int sampleCount, int intervalInMs) {
        //每个窗口时间长度
        this.windowLengthInMs = intervalInMs / sampleCount;
        //总的间隔时间
        this.intervalInMs = intervalInMs;
        //窗口个数
        this.sampleCount = sampleCount;
        //存放窗口类
        this.array = new AtomicReferenceArray<>(sampleCount);
    }

这里就是将时间按照窗口数量化分成相同大小的环形桶,当前请求过来时,根据请求的时间查看落在那个时间窗口内,这里我们以成功通过后的数据统计为入口

 

public WindowWrap<T> currentWindow(long timeMillis) {
    //当前时间不能小于0
    if (timeMillis < 0) {
        return null;
    }
    //计算当前时间的索引
    int idx = calculateTimeIdx(timeMillis);
    // Calculate current bucket start time.
    //时间窗的起始时间
    long windowStart = calculateWindowStart(timeMillis);
    while (true) {
        WindowWrap<T> old = array.get(idx);
        if (old == null) {
            //之前的窗口不存在就创建一个新的
            WindowWrap<T> window = new WindowWrap<T>(windowLengthInMs, windowStart, newEmptyBucket(timeMillis));
            if (array.compareAndSet(idx, null, window)) {//CSA尝试将这个位置的窗口替换
                //替换成功,返回新创建的窗口
                return window;
            } else {
                //更新失败,说明有其他线程在竞争,让出执行权限
                Thread.yield();
            }
        } else if (windowStart == old.windowStart()) {
            //时间窗已创建而且没有过期
            return old;
        } else if (windowStart > old.windowStart()) {
            //时间窗已经过期,需要重置时间窗
            if (updateLock.tryLock()) {
                try {
                    return resetWindowTo(old, windowStart);
                } finally {
                    updateLock.unlock();
                }
            } else {

                Thread.yield();
            }
        } else if (windowStart < old.windowStart()) {
            //除非修改时间否则不会发生
            return new WindowWrap<T>(windowLengthInMs, windowStart, newEmptyBucket(timeMillis));
        }
    }
}

这里array可以理解就是一个环形的桶,首先计算当前时间落在那个桶中,及计算索引值

private int calculateTimeIdx(/*@Valid*/ long timeMillis) {
    long timeId = timeMillis / windowLengthInMs;
    // Calculate current index so we can map the timestamp to the leap array.
    return (int)(timeId % array.length());//计算当前时间在时间窗口数组中的索引
}

然后根据当前时间计算这个桶对应的起始值

//求出所在窗口的起始时间
protected long calculateWindowStart(/*@Valid*/ long timeMillis) {
    return timeMillis - timeMillis % windowLengthInMs;
}

然后根据索引值idx和windowStart计算有几种结果

  • 索引idx位置的时间窗口还没有创建,则说明是这个窗口内的第一次请求,则需要新创建一个时间窗
  • 索引idx位置的时间窗已经创建
    • 如果windowStart > oldwindowStart:说明idx处的时间窗口已经过期是一个无效的时间窗口,则需要重置这个时间窗口windowStart和统计数据为初始值就可以继续使用了
    • 如果windowStart < oldwindowStart:不可能发生,除非修改了时间
    • 如果windowStart = oldwindowStart:说明我们本次请求的时间刚好和idx位置的时间窗口匹配,则返回这个时间窗

时间窗定义的重要属性

private final long windowLengthInMs;//时间窗口长度
private long windowStart;//窗口起始时间
private T value;//统计数据

那每个窗口内的数据是怎么统计的呢?其实是通过MetricBucket类

private final LongAdder[] counters;

private volatile long minRt;//最小RT时间

public MetricBucket() {
    //流控结果
    MetricEvent[] events = MetricEvent.values();
    //计数器
    this.counters = new LongAdder[events.length];
    for (MetricEvent event : events) {
        counters[event.ordinal()] = new LongAdder();
    }
    initMinRt();
}

这里统计的维度定义就在MetricEvent

public enum MetricEvent {

    /**
     * Normal pass.
     */
    PASS,
    /**
     * Normal block.
     */
    BLOCK,
    EXCEPTION,
    SUCCESS,
    RT,

    /**
     * Passed in future quota (pre-occupied, since 1.5.0).
     */
    OCCUPIED_PASS
}

获取所有的MetricEvent,然后创建LongAdder计数器数组,并进行初始化同事对minRt进行初始化。最终所有统计数据其实都是通过LongAdder来进行计数,这个类在高并发下有更高的性能。

我们看下如何获取统计数据

@Override
public long success() {
    data.currentWindow();
    long success = 0;
	//获取有效结果的时间窗
    List<MetricBucket> list = data.values();
    for (MetricBucket window : list) {
        success += window.success();
    }
    return success;
}

public List<T> values() {
        return values(TimeUtil.currentTimeMillis());
    }

    public List<T> values(long timeMillis) {
        if (timeMillis < 0) {
            return new ArrayList<T>();
        }
        //数组数量
        int size = array.length();
        List<T> result = new ArrayList<T>(size);

        for (int i = 0; i < size; i++) {
            WindowWrap<T> windowWrap = array.get(i);
            //如果窗口没有创建或不属于当前统计时间范围则跳过
            if (windowWrap == null || isWindowDeprecated(timeMillis, windowWrap)) {
                continue;
            }
            result.add(windowWrap.value());
        }
        return result;
    }

这里通过当前时间获取有效结果的时间窗集合,然后遍历所有时间窗集合然后或的成功的请求总数。

利用MATLAB和Excel对逆流双管热交换器的热性能进行分析。.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载

相关推荐

利用MATLAB对5G NR波束成形技术的性能分析.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

Sentinel源码解析,Sentinel是如何进行流量统计的?

综上所述,Sentinel 通过对系统调用进行实时跟踪并采用高效的数据结构和算法来统计流量,从而实现精准的流量控制。在源码层面,这些功能主要集中在 Sentinel 的核心统计模块以及各个 Slot 的实现中。Sentinel 在进行流量统计时采用了滑动窗口算法(Sliding Window Algorithm)和其他计数策略,以实现对系统流量的精确控制。

qq_33240556的博客 658

上市公司赫芬达尔指数、企业勒纳指数(1999-2025年)

上市公司赫芬达尔指数(HHI)和勒纳指数(LI)是衡量市场结构和市场势力(垄断力量)的两个重要指标 赫芬达尔指数(HHI)可衡量一个公司在市场中的相对份额或集中度,通过计算公司在市场中份额的平方和得出。数值越小,说明市场份额分布越分散,竞争程度越高;数值越大,说明市场集中度越高,少数企业占据较大份额,垄断程度越高 勒纳指数(LI)用于衡量企业的市场势力,即企业偏离完全竞争价格、制定高于边际成本的价格的能力,数值越接近1,表示企业市场势力越强,垄断程度越高 本文借鉴刘贯春等(2021)、孙茹峰和李楠博(2024)的思路和方法,分别测算上市公司赫芬达尔指数、勒纳指数: 赫芬达尔指数 = (公司营业收入/同行业同年营业收入合计)的平方和 企业勒纳指数 =(营业收入-营业成本-销售费用-管理费用)/营业收入 一、数据介绍 数据名称:上市公司赫芬达尔指数、企业勒纳指数 数据范围:上市公司 时间范围:1999-2025年 样本数量:85810条 数据来源:上市公司年报 更新时间:2026年11月 数据说明:内含原始数据、测算结果 二、数据指标 股票代码 股票简称 年份 省份 城市 区县 省份代码 城市代码 区县代码 行业代码 行业名称 赫芬达尔指数 勒纳指数 营业收入 营业成本 销售费用 管理费用 三、参考文献 [1]刘贯春,叶永卫,张军.社会保险缴费、企业流动性约束与稳就业——基于《社会保险法》实施的准自然实验[J].中国工业经济,2021,(05):152-169. [2]孙茹峰,李楠博.金融化对企业绿色转型意向的影响研究[J].管理学报,2024,21(11):1612-1620+1677. [3]张倩肖,段义学.数字赋能、产业链整合与全要素生产率[J].经济管理,2023,45(04):5-21. [4]伍兆祥,代吉林,

源码分析 Sentinel 实时数据采集实现原理

本篇将重点关注 Sentienl 实时数据收集,即 Sentienl 具体是如何收集调用信息,以此来判断是否需要触发限流或熔断。 本节目录1、源码分析 StatisticSlot1.1 StatisticSlot entry 详解1.2 StatisticSlot exit 详解2、Sentienl Node 体系2、StatisticNode 详解2.1 核心类图2.2 addPassReque...

中间件兴趣圈 5612

工业互联网工控安全与工业质检AI大模型建设方案.pptx

工业互联网工控安全与工业质检AI大模型建设方案.pptx

通信行业CentOS 7内核网络栈优化:高并发连接下UDP/TCP性能调优与系统资源管理

内容概要:本文聚焦于CentOS 7系统在通信行业高并发场景下的性能调优实践,重点围绕内核网络栈优化展开,涵盖UDP/TCP缓冲区调整、文件句柄与连接跟踪表扩容、TIME_WAIT状态复用、软中断分布优化及tuned工具的自动化调优。通过具体配置参数和实际案例(如VoIP软交换系统)深入解析各项调优措施的设计原理与实施效果,有效解决高CPS下丢包、连接失败等问题,并展望了向云化、eBPF等动态智能调优方向的发展趋势。; 适合人群:从事通信系统运维、网络开发或Linux系统性能优化的技术人员,具备一定操作系统和网络基础知识,工作经验1年以上的中初级工程师。; 使用场景及目标:①应用于软交换、媒体网关、信令网关等高并发通信设备的系统调优;②解决UDP丢包、conntrack表满、TCP连接队列溢出等典型性能瓶颈;③提升系统在小包高频、低时延要求场景下的稳定性和吞吐能力。; 阅读建议:建议结合实际生产环境或测试平台同步验证文中配置,重点关注参数背后的物理意义(如BDP、softirq、conntrack机制),并配合ss、conntrack、dmesg等命令进行调优前后对比分析,确保安全可控地实施变更。

Sentinel+prometheus+grafana 实现k8s服务的流控

Sentinel+prometheus+grafana 实现k8s服务的流控

qq_45348142的博客 1934

2024 《计算机网络》实验教学指导书.doc

2024 《计算机网络》实验教学指导书.doc

sentinel统计数据的持久化和查询

本文主要介绍sentinel如何存储统计(metrics)数据以及加快查询速度

qq_31996357的博客 1401

不平衡电网下自抗扰顺序模型预测PWM整流器控制仿真模型(Simulink仿真实现)

内容概要:本文围绕面向城市空中交通的多无人机路径规划问题展开研究,提出了一套融合全局规划、动态避障与局部协同调整的综合路径规划方法。研究内容涵盖基于改进RRT算法与图论的全局路径规划、基于动态风险场和动态窗口法(DWA)的模型预测控制实现动态避障,以及基于分布式协同控制的多无人机局部路径协同策略。通过Matlab平台构建仿真环境,在多种典型城市交通场景下对所提方法进行了系统性验证,结果表明该方法在路径安全性、编队稳定性与任务效率方面表现优异。文章还深入探讨了算法的创新点与未来研究方向,为复杂城市环境下多无人机系统的自主协同提供了理论支撑与技术路径。; 适合人群:具备自动化、控制理论、计算机科学或相关领域基础知识,从事无人机系统、智能交通、路径规划、多智能体协同控制等方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①为城市空中交通系统中的多无人机安全、高效飞行提供可靠的路径规划解决方案;②支持在复杂、动态的城市场景中开展无人机自主导航、编队飞行与协同控制的技术研究与仿真验证。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点关注算法的具体实现细节、参数配置对性能的影响以及不同仿真场景下的实验设计,以深入理解各模块的集成逻辑与实际应用效果。

【选址和定容】模拟退火改进多目标粒子群算法在分布式电源选址和定容中的应用【IEEE69节点】(Matlab代码实现)

内容概要:本文研究了模拟退火改进多目标粒子群算法在分布式电源选址和定容中的应用,以IEEE69节点配电系统为算例进行仿真分析。通过融合模拟退火算法的强全局搜索能力与粒子群算法的高效局部收敛特性,构建了一种改进的多目标优化算法,用于解决分布式电源在配电网中的最优位置选择与容量配置问题。研究旨在实现多重优化目标,包括最小化网络有功损耗、提升节点电压质量、增强系统运行的经济性与稳定性。文中详细阐述了多目标优化模型的数学构建、算法的改进机制与实现流程,并基于Matlab平台完成了算法编程与仿真验证,结果表明所提方法在求解质量和收敛性能上均优于传统算法。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力,从事配电网规划、分布式能源系统优化、智能优化算法应用等相关领域的科研人员、工程师以及高校研究生。; 使用场景及目标:①解决高比例分布式电源接入背景下配电网的科学规划问题;②为新型电力系统中源网协调设计提供有效的优化工具;③为相关领域的科研工作提供可复现、可拓展的算法模型与仿真代码实例,支持进一步的算法对比与功能升级。; 阅读建议:建议读者结合提供的Matlab代码与IEEE69节点标准数据,动手复现实验结果,深入理解算法的参数设置、迭代过程与多目标折衷分析方法,并可根据实际研究需求修改目标函数或引入新的约束条件以适应不同的应用场景。

sentinel原理源码分析系列(六)-统计指标

上图展示是一个StatisticNode内的情况,其他的node,clusterNode,DefaultNode都继承StatisticNode,圆形/方形/三角形代表着某类型指标(pass,block等)一次增加数,一段时间多个线程调用资源产生多个的指标增加数,如一个窗口时段内多个图形,时间窗口时段内增加指标数落入时间窗口内,即WindowWrap对象内,限流插槽调用metric获取该时间窗口内所有指标增加值(LongAdder表示),累加在一起。下面以请求通过数代码为例子。上图是统计指标的类互动图。

leehom的博客 703

OptiSystem仿真:波分与时分复用混合光网络的设计与性能优化

本文详细介绍了如何利用OptiSystem软件设计与优化波分复用与时分复用混合光网络。通过构建四路波分乘以四路时分的系统模型,文章阐述了从信源生成、复用合并、光纤传输到信号解复用与性能评估的全流程,并重点探讨了对抗色散、优化器件参数及探索高级调制格式等核心性能优化策略,为应对未来海量数据需求提供了高效、可行的仿真解决方案。

pink的博客 1106

Sentinel源码(四)(滑动窗口流量统计)

在Sentinel源码(三)slot解析中,我们讲到: StatisticSlot是专用于实时统计的处理器插槽。 进入这个slot时,我们需要单独统计以下信息: ClusterNode:资源ID的集群节点的总统计。 OriginNode:来自不同callersorigins的集群节点的统计信息。 DefaultNode:特定上下文中特定资源名称的统计信息。 所有入口的总和统计。 我们知道了entry方法中下面的代码是线程数和流量统计 // Request passed, add thread count

Ethan_199402的博客 992

模仿学习(Imitation Learning)概述

什么是模仿学习呢?简单来说,模仿学习(Imitation Learning),就是要训练机器能够复制人类的连续动作,进而达到模仿的目的。其实,Imitation Learning的实用性很高,假设今天有一个训练场景,你不知道该怎么定奖励值(reward),但是你可以收集到专家的示范数据(expert demonstration data),你就可以考虑用Imitation Learning这个方法。因此,模仿学习也被寄予很高的期待,成为下一代强人工智能的关键技术。......

qq_22749225的博客 2万+

ESP-CSI:使用ESP32进行CSI(信道状态信息)采集

使用esp32进行csi(信道状态信息)采集和处理

capsize的博客 8280

SCA:二、Sentinel熔断、降级、限流

本文详解在Spring Cloud Alibaba环境下,通过Nacos与OpenFeign集成Sentinel实现服务降级的完整配置流程。重点包括:添加Sentinel依赖、开启Feign支持、定义降级兜底类(需@Component)、Feign接口配置fallback,并部署Sentinel Dashboard进行熔断限流规则配置。

博风_刺耳的博客(网络记事本) 224

山景BP10_128DBG开发板通过蓝牙连接手机放歌实验回顾

最近在学习上海山景公司的BP10_128DBG的开发板,因为网上关于BP10开发板的帖子也比较少,在学习的时候也没有太多的参考资料,基本上都是官方的历程。蓝牙放歌这个demo对我来说也比较复杂,特写下此博客进行记录、总结,大家有需要的可以参考。

weixin_56646002的博客 2019

Sentinel异常处理

sentinel触发异常的几种情况。

郭小李 164

置顶必读(1) | 2026最新首发,全网最全 Spring Boot 学习宝典(附思维导图)

从0到1以知识点+实例+项目的教学模式对SpringBoot框架由浅入深进行学习,快来跟bug菌一起学习吧。

**My Coding Family** 16万+

ZYNQ系列PS侧和PL侧DDR3或DDR4在AD(Altium Designer 25)中的layout布线规则约束

DDR3或DDR4的PCB布线规则通常有相对固定的要求,对应的,在PCB设计时有固定的约束设置。

FPGA艺术家的博客 785

第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案

本文针对多厂商LLM调用中因接口响应慢、服务异常导致线程池耗尽、系统雪崩的痛点,提出以Sentinel实现慢调用熔断降级。通过在LlmBizService中标注资源、配置2秒慢调用阈值与50%占比熔断规则,结合“重试→熔断”正确顺序,实现故障时快速拦截流量,保护核心业务。强调熔断与重试的协作关系、资源隔离、返回标准化及控制台动态调参等实战要点,为LLM场景提供稳定可靠的容灾能力。

qq_55253420的博客 308

3D LUT Color Conversion之总体架构设计之三

摘要:本文提出了一种基于三维坐标一维化寻址的四面体网格编码方法。通过定义全局网格坐标P(R,G,B)=R+9G+81B和局部增量(ξ,η,ζ)∈{0,1},推导出偏移量Δ(ξ,η,ζ)=ξ+9η+81ζ的平移不变性质。该方法将6种坐标排序情况(Case)对应的固定偏移量三元组预先存储,其中V0和V3的偏移量恒定为0和91。硬件实现时只需根据Case选择对应常量组,无需实时计算坐标,显著提高了处理效率。该方案利用线性寻址公式的特性,确保相同局部结构在不同位置具有一致的偏移模式。(149字)

大熊 46

【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c

AI 编程时代,开发语言选型需综合考量AI适配度、编译速度、跨平台与学习成本。Python以海量语料和即时执行成首选,适用于AI/ML与原型开发;TypeScript凭借类型系统与秒级构建,成为前端及应用层主流;Go以极速编译与统一风格,契合AI代理高效迭代需求。Rust/C++虽性能强,但编译慢、学习成本高,不适于快速试错。综合推荐:优先选Python、TypeScript、Go,兼顾效率与生态,实现最优AI协作体验。

freewebsys的专栏 484

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: sentinel源码分析-07GatewayFlowSlot网关限流
下一篇: sentinel源码分析-09流量整形控制器
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值