利用线程池来控制访问频率

news/2024/5/9 5:04:32 标签: java, 开发语言

背景:某资源的查询接口,一共有四个渠道,均要调用查询接口落缓存,且均有QPS限制,现要通过线程池配置来控制查询频率。

渠道A渠道B渠道C渠道D
QPS52102

思路:通过涉及线程池中的核心线程数、最大线程数、队列长度来达到限流的目的,四个渠道因QPS要求不一,则分别配置四个池子。

示例:

java">@Bean(name = "XxPoolExecutor")
    public ThreadPoolTaskExecutor xxQueryPoolExecutor() {
        String channelPoolSize = annotatedBean.getChannelPoolSize();
        ChannelPoolConfig channelPoolConfig = JSONObject.parseObject(channelPoolSize, ChannelPoolConfig.class);
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(channelPoolConfig.getFlightMasterCorePoolSize());
        executor.setMaxPoolSize(channelPoolConfig.getFlightMasterMaxThreadNum());
        // 线程池维护线程所允许的空闲时间
        executor.setKeepAliveSeconds(60);
        // 队列容量
        executor.setQueueCapacity(1000);
        // 等待任务执行完成在关闭
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //该方法用来设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
        executor.setAwaitTerminationSeconds(60);
        // 线程前缀名称
        executor.setThreadNamePrefix("async-query-service-");
        // 配置拒绝策略:如果队列满了,继续往队列增加数据,则由调用线程处理该任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        try {
            executor.initialize();
        }catch (Exception e){
            e.printStackTrace();
        }
        return executor;
    }

线程池配置有以下几个关键的参数:

更具体的细节及示例见:👉    手写线程池及四种拒绝策略解析

1.常驻核心线程数

        保证有多少个线程一直在等待新任务的到来,当任务到来时,线程池不用新建线程而是直接利用空闲的核心线程执行任务。

2.队列长度

        当核心线程数打满且有新任务提交时,任务会放在队列等待执行。

3.最大线程数

        线程池能够容纳同时执行的最大线程数,当核心线程及队列都被占满任务时,线程池会判断新提交的任务是否大于最大线程数,若是则触发拒绝策略;反之则新建线程来执行。

        有些晦涩,举例来说:核心线程数为2,队列长度为5,最大线程数为3。

当第一个,第二个任务被提交到线程池后,可以立即执行;

若此时前两个任务未执行结束,又过来5个任务,此时队列已满;

若再提交一个任务,则触发最大线程数(新开一个线程来执行);

若此时再提交任务,只能触发拒绝策略了。


http://www.niftyadmin.cn/n/393979.html

相关文章

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO 这是一篇总结文章。 文章目录 JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO1、学习技术的梳理1.1、jdbc的引入1.2、ResultSet[结果集]1.3API小结 2、数据库连接池3、Apache公司的DBUtils工具-BasicDAO…

连接万物,创造未来,多角度看物联网技术如何影响我们的生活

连接万物,创造未来。从智能家居到智慧医疗,从智能车联到智慧城市,物联网技术的影响已经悄然渗透到了我们的方方面面。接下来我们将从物联网技术概述、发展的历史原因、物联网技术应用、创新和挑战几个角度深度了解物联网已经深入我们日常生活…

网络安全学术顶会——NDSS 2023 议题清单、摘要与总结(下)

51、Let Me Unwind That For You: Exceptions to Backward-Edge Protection 通过堆栈缓冲区溢出进行反向边控制流劫持是软件利用的终极目标。直接控制关键的堆栈数据和劫持目标使得攻击者特别喜欢这种利用策略。因此,社区已经部署了强大的反向边保护,如影…

20230531----重返学习-redux总步骤-TaskOA-react路由管理方案react-router-dom

day-082-eighty-two-20230531-redux总步骤-TaskOA-react路由管理方案react-router-dom redux总步骤 确定基础骨架目录。 fang/f20230531/src/store/index.jsfang/f20230531/src/store/reducers/ fang/f20230531/src/store/reducers/index.jsfang/f20230531/src/store/reducers…

【Linux】基本开发工具包使用

目录 一, yum ——linux软件包管理器 1. 软件包是啥子? 2. yum基本使用 1. 步骤: 2. 开发工具推荐(centos 7.6) 二,vim —— linux文本编辑器 1. Normal mode —— 命令模式(记不住没关系&#x…

Spring(四)基于xml的自动装配

自动装配:根据指定的策略,在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值。 首先我们来熟悉三层架构的创建过程: 三层架构为controller层,service层,dao层。 在service层里面创建ser…

​LeetCode解法汇总2465. 不同的平均值数目

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组…

【深度学习-第1篇】深度学习是什么、能干什么、要怎样学?

大概4年前本专栏发布了一篇关于神经网络的入门科普文章,到现在大概有小5k赞了(Mr.看海:神经网络15分钟入门!足够通俗易懂了吧)。 这几年人工智能发生了突飞猛进的发展,时至今日甚至发展出了GPT-4、Midjourn…