`
iwinit
  • 浏览: 454613 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

某个流控工具分析

 
阅读更多

   

  处理流程:

1.       在web容器启动时,通过SphFilter启动降级线程,初始化整个Sph框架。

Web.xml配置:

<filter>
     <filter-name>SphFilter</filter-name>
     <display-name>SphFilter</display-name>
     <filter-class>com.xxxx.common.stable.SphFilter</filter-class>
  </filter>
  <filter-mapping>
     <filter-name>SphFilter</filter-name>
     <url-pattern>*.htm</url-pattern>
  </filter-mapping>
<filter-mapping>
 

 

Init代码:

     ……
       // load default conf
       SphDRuntime.init(null);

        if (monitor != null) {
           monitor.stop();
       }
       monitor = newSphMonitor();
       new Thread(monitor).start();
   }
 

2.       业务代码初始化CtSph

Sph sph = new CtSph("GetBuyerLevel", 10, 50,ValveType.COUNT_AND_AVGELAPSED_VALVE_TYPE);
 

3.       业务代码调用CtSph.entry()

1)       判断是否被流控

if(valveType == ValveType.COUNT_VALVE_TYPE || valveType ==ValveType.COUNT_AND_AVGELAPSED_VALVE_TYPE) {
           isEntry = (count.get() < countValve.get()) ? true : false;
        }
 

比较两个AtomicInteger大小,非线程安全,高并发时会有高于阀值线程进入,作者说不用CAS是因为性能,并发数没有精确控制需求

2)       初始化ThreadLocal的entries变量,Entry的作用是保存线程的进入时间,支持可重入,同一个线程可以多次使用同一个流控组件,最多100层,用数组模拟stack

3)       如果不流控,则递增当前并发数,否,输出日志

 

4.       业务代码运行一段时间后,调用CsSph.release

1)       Entries递减,释放掉stack(用数组模拟)上最顶层的entry,记录消耗时间,并将时间存入统计数组ConcurrentCircleArray

2)       递减当前并发数

 

后台降级线程SphMonitor逻辑:

1.       遍历SphDRuntime中的每个流控组件

2.       计算该组件的平均消耗时间

int aveElapsed = sph.getDetailElapsed().getArrayAvg();

3.       如果超过阀值则降级,这里有个最低并发值保证,默认为0

                                                              if (aveElapsed > sph.getAvgElpasedValve()) {
                               if (sph.getCountValve().get() <=sph.getLowCountValve()) {
                                   log.info(key + "LowCountValve=" + sph.getLowCountValve());
                               } else {
                                   int cv = sph.getCountValve().addAndGet(-2);
                                   log.info(key + " decrementCountValve=" + cv + " avgElapsed=" +aveElapsed);
                               }
                           }
 

4.       如果没超过阀值,则恢复并发阀值

                      if (sph.getCountValve().get() <sph.getDefaultCountValve()) {
                                   sph.getCountValve().set(sph.getDefaultCountValve());
                                   log.info(key + " resetCountValve=" + sph.getDefaultCountValve());
                               }
 
分享到:
评论
1 楼 hewei1997 2013-07-21  
讲了代码,但是没讲原理,我觉得其实原理更重要一些

相关推荐

    流控大师3.12

    流控大师3.12是一款专门用于网络流量控制和管理的软件工具,它在企业网络环境中扮演着重要的角色。此版本的更新可能包含了对先前功能的优化、性能提升以及新特性的添加,以更好地满足用户对网络带宽管理和流量监控的...

    基于微流控芯片的液滴被动式融合数值仿真研究.pdf

    COMSOL Multiphysics是一款广泛应用于工程、物理等领域的仿真软件,它能够用于模拟和分析各种物理现象。在微流控芯片研究领域,COMSOL Multiphysics通过其内置的两相流模块,可以帮助研究人员对微流控芯片内液滴的...

    COM测试工具包

    用户可以设置波特率、数据位、停止位、校验位以及流控选项,以适应不同的硬件设备和通信协议需求。此外,它还具有记录和回放功能,方便进行重复测试和故障排查。 SSCOM则是一款专门的串口通信软件,它的功能与串口...

    一站式学习Wireshark1

    本篇文章将详细介绍Wireshark的基本用法,包括如何抓取、过滤和查看网络报文,以及如何利用其IO图形工具分析数据流。 1. 下载与安装Wireshark: 首先,你需要从官方网站下载适合你操作系统的Wireshark版本,并进行...

    数字微流控生物芯片的多目标驱动放置技术

    生物芯片技术是当前生化分析领域的一项重要技术,特别是数字微流控生物芯片,因其低成本、高精度和高效能,在生化工业领域得到了广泛的应用。数字微流控生物芯片(Digital Microfluidic Biochips, 简称DMFB)主要...

    车载测试Vector工具CANoe——常见问题汇总(上).docx

    问题描述:当CANoe使用OSEK_TP.DLL模拟节点接收数据时,如果接收到的数据量超过4095字节,则节点会回复过载流控帧FC.OVFLW(0x32 0x00)。那么在这种情况下应当如何处理呢? **解决方案**:在CAN传输协议(CAN TP)...

    串口调试软件.rar

    标题中的“串口调试软件.rar”表明这是一个关于串口调试工具的压缩文件,可能是某个特定的串口通信软件。在IT行业中,串口(Serial Port)是计算机硬件接口之一,常用于设备之间的通信,比如嵌入式开发、物联网设备...

    http协议计算机网络实验报告

    当浏览器缓存了某个资源并再次请求时,可能会发送一个带有`If-Modified-Since`首部的GET请求,询问服务器资源是否在指定时间后有更新。若资源未修改,服务器会返回304状态码,告知浏览器使用本地缓存;若已修改,则...

    ug_ethernet_fpga_

    这个说明书可能是由某个芯片或IP核供应商提供的,用于指导工程师如何在FPGA中实现和配置千兆以太网功能。 描述中的“三态千兆网”指的是在FPGA中实现的以太网接口通常包含三态输出,即能够控制信号的开、关和高阻...

    ch非线性电路介绍实用学习教案.pptx

    非线性电路是一种不遵循欧姆定律的电路,其中的电阻元件表现出的伏安特性并非简单的线性关系。这些电阻元件的伏安特性遵循特定...这使得非线性电路的分析更加复杂,通常需要利用微分方程或者计算机辅助分析工具来求解。

    0523_等出力_

    在给定的"0523.obj"文件中,虽然没有具体的信息来深入分析其内容,但我们可以假设这是一个与等出力计算相关的对象文件,可能是某种性能测试工具的输出结果,或者是数据处理算法的一部分。这样的文件通常包含执行过程...

    串口接收程序

    1. **配置串口参数**:程序需要允许用户设置串口的基本参数,如波特率(常见的有9600、19200、38400等)、数据位(通常为5、6、7、8位)、停止位(1或2位)、校验位(无校验、奇校验、偶校验和xon/xoff流控)等,...

    lpc111x uart source code

    8. **调试技巧**:分享如何使用调试工具(如Oscilloscope、逻辑分析仪或IDE的调试器)来验证UART通信的正确性,并解决可能出现的问题。 通过这个压缩包中的源代码和相关文档,开发者可以学习如何充分利用LPC111x的...

    Panabit实施策略经验

    通过对报告的分析,我们可以优化策略,例如,如果发现某个应用占用了过多带宽,可以进一步细化限速规则,或者调整其优先级。 故障排查和维护也是Panabit实施策略的一部分。当出现网络性能下降或策略执行不当时,要...

    SpringCloud网关组件gateway

    - **Predicate(断言)**:断言用于判断请求是否应由某个路由处理。它们基于 Spring Framework 的 `org.springframework.util.PathMatcher`,支持路径、HTTP 方法、请求头等多种条件匹配。 - **Filter(过滤器)**...

    微服务架构实战指南: 构建与治理高可用微服务系统

    - **定义**:Sleuth 是Spring Cloud生态下的链路追踪工具,能够收集并展示请求在微服务间的调用链路。 - **应用场景**: - 监控微服务调用链路,便于定位问题。 - 性能分析,识别瓶颈。 - **消息队列(RocketMQ...

    实验4 串口实验.zip_嵌入式/单片机/硬件编程_C/C++_

    为了调试和验证串口通信的效果,开发者通常会使用串口终端工具,如PuTTY或Minicom,它们可以实时显示接收到的数据,帮助我们查看和分析串口通信的正确性。 总结来说,这个“实验4 串口实验”涵盖了串口通信在嵌入式...

    带你去MQ的世界旅行

    通过对以上内容的总结和分析,我们可以看出消息中间件在现代IT系统中的重要地位以及其为提高系统性能和可靠性所发挥的作用。无论是Kafka还是RabbitMQ,都有其独特的应用场景和技术特点,开发者可以根据具体的业务...

Global site tag (gtag.js) - Google Analytics