前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从0到1,利用Spring Boot与Apollo轻松搞定动态线程池参数配置

从0到1,利用Spring Boot与Apollo轻松搞定动态线程池参数配置

作者头像
xiaoyi
发布2024-04-10 16:06:16
1860
发布2024-04-10 16:06:16
举报
文章被收录于专栏:小义思小义思

在高并发的系统中,合理配置线程池是提高系统稳定性与效率的关键。然而,在不断变化的业务场景下,静态的线程池配置往往难以适应所有情形。借助Spring Boot强大的自动化配置以及Apollo配置中心的动态配置能力,我们可以实现线程池参数的动态调整。

小义这里使用的是spring提供的ThreadPoolTaskExecutor,核心代码如下:

代码语言:javascript
复制
public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport
        implements AsyncListenableTaskExecutor, SchedulingTaskExecutor {
    
    // 核心参数包括:
    private int corePoolSize; // 核心线程数
    private int maxPoolSize; // 最大线程数
    private int keepAliveSeconds; // 线程空闲后的存活时间
    private int queueCapacity; // 队列容量
    ...
}

至于springboot整合apollo,这里就不多介绍了,网上都是教程。不过还是得建议大家从官方文档入手,地址:https://www.apolloconfig.com/#/zh/client/java-sdk-user-guide。

下面创建线程池配置类和属性类。

代码语言:javascript
复制
@ConfigurationProperties(prefix = "threadpool")
public class ThreadPoolProperties {
    // 属性声明
}

@Configuration
@EnableConfigurationProperties(ThreadPoolProperties.class)
public class ThreadPoolConfig {
    // 创建线程池的Bean
}

通过apollo配置动态监听配置变化。

代码语言:javascript
复制
@Component
public class ThreadPoolConfigChangeListener {
    private final ThreadPoolTaskExecutor executor;
    private final ThreadPoolProperties properties;

    public ThreadPoolConfigChangeListener(ThreadPoolTaskExecutor executor,
                                          ThreadPoolProperties properties) {
        this.executor = executor;
        this.properties = properties;
    }

    @ApolloConfigChangeListener
    public void onChange(ConfigChangeEvent changeEvent) {
        boolean corePoolSizeChanged = changeEvent.isChanged("threadpool.coreSize");
        boolean maxPoolSizeChanged = changeEvent.isChanged("threadpool.maxSize");
        boolean queueCapacityChanged = changeEvent.isChanged("threadpool.queueCapacity");
        
        if (corePoolSizeChanged || maxPoolSizeChanged || queueCapacityChanged) {
            // 核心线程数(corePoolSize)可以热更新
            if (corePoolSizeChanged) {
                int newCorePoolSize = properties.getCoreSize();
                executor.setCorePoolSize(newCorePoolSize);
            }

            // 最大线程数(maxPoolSize)可以热更新
            if (maxPoolSizeChanged) {
                int newMaxPoolSize = properties.getMaxSize();
                executor.setMaxPoolSize(newMaxPoolSize);
            }
            
            // 队列容量(queueCapacity)更新复杂,不能直接修改现有的队列实例
            if (queueCapacityChanged) {
                // 可以通过新建队列及线程池实例来实现队列容量的更新
            }
            
            // 执行修复旧任务持有的线程
            executor.afterPropertiesSet();
        }
    }
}

这样就可以简单的实现动态线程池配置了,需要注意的是,调整线程池参数必须需要谨慎地评估和测试,以防止系统在动态调整后出现资源不足或过度资源闲置的问题。

下面介绍下参数变动后线程池的行为变化:

  1. corePoolSize更新后:如果新的值大于旧的值,线程池可创建新的核心线程处理任务。如果新的值小于旧的值,多余的核心线程会在下一个keepAliveTime周期后被回收。
  2. maxPoolSize更新后:允许线程池在高峰时创建更多线程(直至新的最大线程数)或者在减少maxPoolSize后将超出部分的线程在keepAliveTime时间后回收。
  3. queueCapacity更新则相对复杂,因为它涉及到队列中任务的实时迁移问题,一般不建议动态修改。如果必要进行修改,则应该创建一个新的线程池实例替换旧的线程池。

当然,apollo只是用来存放线程池参数,也可以选择其他的配置中心,最后附一张常见配置中心对比图。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小义 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档