sentinel中流控规则 并发线程数的实战理解

news2024/10/1 23:47:43

先看下官网文档关于并发线程数的解释:链接地址

在这里插入图片描述

public class FlowThreadDemo {

    private static AtomicInteger pass = new AtomicInteger();
    private static AtomicInteger block = new AtomicInteger();
    private static AtomicInteger total = new AtomicInteger();
    private static AtomicInteger activeThread = new AtomicInteger();

    private static volatile boolean stop = false;
    private static final int threadCount = 100;

    private static int seconds = 60 + 40;
    private static volatile int methodBRunningTime = 2000;

    public static void main(String[] args) throws Exception {
        System.out.println(
            "MethodA will call methodB. After running for a while, methodB becomes fast, "
                + "which make methodA also become fast ");
        tick();
        initFlowRule();

        for (int i = 0; i < threadCount; i++) {
            Thread entryThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        Entry methodA = null;
                        try {
                            //TimeUnit.MILLISECONDS.sleep(5);
                            methodA = SphU.entry("methodA");
                            activeThread.incrementAndGet();
                            Entry methodB = SphU.entry("methodB");
                            TimeUnit.MILLISECONDS.sleep(methodBRunningTime);
                            methodB.exit();
                            pass.addAndGet(1);
                        } catch (BlockException e1) {
                            block.incrementAndGet();
                        } catch (Exception e2) {
                            // biz exception
                        } finally {
                            total.incrementAndGet();
                            if (methodA != null) {
                                methodA.exit();
                                activeThread.decrementAndGet();
                            }
                        }
                    }
                }
            });
            entryThread.setName("working thread");
            entryThread.start();
        }
    }

    private static void initFlowRule() {
        List<FlowRule> rules = new ArrayList<FlowRule>();
        FlowRule rule1 = new FlowRule();
        rule1.setResource("methodA");
        // set limit concurrent thread for 'methodA' to 20
        rule1.setCount(20);
        rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD);
        rule1.setLimitApp("default");

        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
    }

    private static void tick() {
        Thread timer = new Thread(new TimerTask());
        timer.setName("sentinel-timer-task");
        timer.start();
    }

    static class TimerTask implements Runnable {

        @Override
        public void run() {
            long start = System.currentTimeMillis();
            System.out.println("begin to statistic!!!");

            long oldTotal = 0;
            long oldPass = 0;
            long oldBlock = 0;

            while (!stop) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                }
                long globalTotal = total.get();
                long oneSecondTotal = globalTotal - oldTotal;
                oldTotal = globalTotal;

                long globalPass = pass.get();
                long oneSecondPass = globalPass - oldPass;
                oldPass = globalPass;

                long globalBlock = block.get();
                long oneSecondBlock = globalBlock - oldBlock;
                oldBlock = globalBlock;

                System.out.println(seconds + " total qps is: " + oneSecondTotal);
                System.out.println(TimeUtil.currentTimeMillis() + ", total:" + oneSecondTotal
                    + ", pass:" + oneSecondPass
                    + ", block:" + oneSecondBlock
                    + " activeThread:" + activeThread.get());
                if (seconds-- <= 0) {
                    stop = true;
                }
                if (seconds == 40) {
                    System.out.println("method B is running much faster; more requests are allowed to pass");
                    methodBRunningTime = 20;
                }
            }

            long cost = System.currentTimeMillis() - start;
            System.out.println("time cost: " + cost + " ms");
            System.out.println("total:" + total.get() + ", pass:" + pass.get()
                + ", block:" + block.get());
            System.exit(0);
        }
    }
}

运行结果:
在这里插入图片描述
官方给出的demo的大概意思就是:

设置流控规则为并发线程数==20
模拟100个并发线程执行methodA调用methodB,期间模拟了methodB的方法执行耗时。
在前60秒,methodB方法耗时2秒,所以在前60s内的每2s内会在20个线程执行一遍,所以会出现前一秒pass=20,后一秒pass=0的情况
在后20秒,methodB方法耗时20ms,所以20线程在每一秒里执行了大概25遍(wihle循环)

从demo打印的日志来看得出如下结论:

并发线程数控制的是方法执行的线程数量,对于应用而言,每秒处理的数据约等于 并发线程数量*单位时间内能够处理的次数。

带着结论自己测试一遍

并发线程数==2
分别测试并发100,500,1000,2000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述并发线程数==10

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从上述数据来看,并发线程数控制着处理处理入口流量的线程数,从给出的官方demo意图在于表述在面对大量请求时,能够很好的保护耗时操作不被大量的qps拖垮,从自身的测试看出,在处理数据rt近似平均的时候,越大的并发数能够处理更多的流量。

在面对突然的大流量时,如果机器的性能足够好,可以适当增大线程数,增加处理量,如果机器的性能一般时,为防止被突如其来的大量线程数拖垮时,可以起到限制作用,保护应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux_mysql安装教程带安装包(亲测有效)

文章目录1.检查当前系统是否安装mysql2.上传mysql安装包/opt/software目录下3.解压安装包4.在安装目录下执行rpm安装5.删除/etc/my.cnf文件中datadir指向的目录下所有内容&#xff0c;6.初始化数据库7.查看临时生成的root用户密码8.启动mysql服务9.登陆mysql数据库10.修改root用…

Fiddler导出JMeter脚本插件原理

目录 一、Fiddler导出JMeter脚本插件原理 二、Fiddler导出JMeter脚本插件的基本使用 结语 一、Fiddler导出JMeter脚本插件原理 既然JMeter本质上是一个xml文档&#xff0c;Fiddler可以抓取HTTP请求包&#xff0c;插件的基本原理就是Fiddler抓取HTTP请求包将HTTP请求信息通过…

【电商项目实战】修改密码(详细篇)

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;SpringBoot电商项目实战 ✨学习社区&#xff1a; &#x1f449;不会压弯的小飞侠 ✨知足上进&#x…

乾元通4G/5G多链路聚合设备在公共安全通信方面解决方案

政府部门对应急指挥系统提出了更高的要求&#xff0c;在特殊情况下需要能够迅速建立紧急指挥中心&#xff0c;通过应急指挥系统统一协调、统一调度相关部门协同工作&#xff0c;达到“及时了解&#xff0c;快速反应&#xff0c;准确决策&#xff0c;统一调度&#xff0c;妥善处…

面试半年,上个月成功拿到阿里offer,全靠我啃烂了学长给的这份笔记

前言 不论是校招还是社招都避免不了各种⾯试、笔试&#xff0c;如何去准备这些东⻄就显得格外重要。不论是笔试还是⾯试都是有章可循的&#xff0c;我这个“有章可循”说的意思只是说应对技术⾯试是可以提前准备&#xff0c;所谓不打无准备的仗就是这个道理。 以下为大家&…

牛血清白蛋白修饰葡萄糖 BSA-glucose,木糖/半乳糖/乳糖偶联牛血清白蛋白

产品名称&#xff1a;牛血清白蛋白修饰葡萄糖 英文名称&#xff1a; BSA-glucose 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 牛血清中的简单蛋白&…

创作纪念日 编程练习 - 斐波那契数列

文章目录我的第一次今日份练习| 斐波那契数列憧憬我的第一次 第一次浏览CSDN的时候刚开始学C的时候&#xff0c;当时的课设是《C & SQL 2008的学生管理系统》&#xff0c;C作前段界面、逻辑处理&#xff0c;SQL作为后端服务器支持的题目&#xff0c;当时不太认真学习&…

化纤企业净利润下滑,纺织企业如何利用APS排产减轻盈余压力

根据国家统计局数据&#xff0c;2022年前三季度&#xff0c;全国规模以上纺织企业工业增加值同比减少0.4%&#xff0c;营业收入同比增长3.1%&#xff0c;利润总额同比减少23.6%&#xff0c;增速均较上年同期有所放缓。 从全产业链看&#xff0c;中下游印染、长丝织造、服装等分…

Qt之读写文件

1.思路 读写文件的基本操作&#xff1a; 读文件 写文件 打开文件 打开文件 读取文件 写入文件 关闭文件 关闭文件 2.QFile实现读写文件 QFile类提供读写文件的接口。 它的构造函数如下&#xff1a; QFile(const QString & name) QFile(QObject * parent) QFile(c…

点击化学 PEG 试剂:1802907-92-1,Mtz-PEG4-NHS,甲基四嗪-四聚乙醇-活性酯

【中文名称】甲基四嗪-四聚乙醇-活性酯 【英文名称】 Methyltetrazine-PEG4-NHS ester&#xff0c;Mtz-PEG4-NHS 【结 构 式】 【CAS号】1802907-92-1 【分子式】C24H31N5O9 【分子量】533.54 【基团部分】Methyltetrazine 【纯度标准】95% 【包装规格】5g&#xff0c;10g&…

安卓有哪些耳机好用?好用的安卓蓝牙耳机推荐

市面上的蓝牙耳机五花八门&#xff0c;许多消费者在选购的时候不知道如何选择&#xff0c;除了苹果以外&#xff0c;其他的都要细心参考一下&#xff0c;由于苹果耳机市场的价格昂贵&#xff0c;不少的人选择其他品牌的替代&#xff0c;作为一位追求性价比的消费者而言&#xf…

HTML5期末大作业:HTML+CSS茶叶官网网页设计实例 企业网站制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Dubbo底层网络连接模型

在Dubbo中&#xff0c;有两个参数⽤来配置服务消费者和服务提供者直接的socket连接个数&#xff1a; shareconnections&#xff1a;表示可共享的socket连接个数connections&#xff1a;表示不共享的socket连接个数 服务A的shareconnections为2时&#xff0c;服务A的消费者会向…

CANoe-vTESTstudio之Waveform编辑器

1. 什么是Waveform编辑器 Waveform Editor,波形编辑器,可以创建曲线(随时间变化值变化的模式)来刺激信号和系统变量。在刺激过程中可以使用checkpoints(检查点)来测试被测系统的行为 简单来说,就是在一个坐标轴上,x轴是时间,y轴是刺激的信号或系统变量值。在指定的时…

算法设计与分析期末复习不挂科

算法的基本概念 算法概念 通俗讲:算法是解决问题的一种方法或一个过程 严格讲:算法是解某一特定问题的一组有穷规则的集合 且满足以下性质: 有限性:算法在执行有限步之后必须终止确定性:算法的每一个步骤都有精确的定义,要执行的每一个动作都是清晰的,无歧义的输入:一个算法有…

关于nodejs调用c/c++代码的一些感悟

帮客户解决问题&#xff0c;他们做的业务涉及到硬件&#xff0c;但是桌面端程序员离职&#xff0c;临时接手的人员&#xff0c;只会node&#xff0c;于是希望通过node调用c 基本套路&#xff0c;使用ffi和ref插件&#xff0c;打开设备正常&#xff0c;但就是无法读取数据。 接…

【Python游戏】用Python实现一个测试你智商的小游戏——24点,过不了三关的都是细狗 | 附带源码

前言 好咯&#xff0c;包子们下午好 今天小编主要是过来测试一下大家的智商&#xff0c;没别的意思&#xff0c;不是看不起大家&#xff0c;我感觉今天实现的小游戏&#xff0c;可能大家真的过不了三关&#xff01; 哈哈哈&#xff0c;废话不多说吧 直接开始我们的游戏实现功能…

五、【React-Router6】路由表 useRoutes() + Outlet

文章目录1、useRoutes() 介绍2、简单 CODING2.1、项目结构2.2、routes.js2.3、App.js2.4、Result3、嵌套 Outlet CODING3.1、项目结构3.2、routes.js3.3、Home.js3.4、App.js3.5、Result1、useRoutes() 介绍 原来写的路由管理如下 <Routes><Route path/about elemen…

codeforces:C. Almost All Multiples【构造 + 贪心】

目录题目截图题目分析ac code总结题目截图 题目分析 现在p1 x, pn 1如果我们一开始按1234…这样放字典序是最小的所以根据这个思路&#xff0c;我们还是按这个构造&#xff1a;那么我们的n被挤出来了&#xff0c;只能放到px上所以如果一开始x不能整除n的话&#xff0c;就直接…

Linux安装MySQL【Ubuntu20.04】

操作系统&#xff1a;Ubuntu20.04 使用工具&#xff1a;xshell7、xftp7 MySQL版本&#xff1a;5.7 一、删除Linux系统下自带的mariadb &#xff08;因为centos自带一个老版Mariadb 与MySQL冲突&#xff09; 如果没有找到Mariadb直接跳过 #查找Mariadb rpm -qa | grep maria…