最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Nacos實(shí)現(xiàn)動(dòng)態(tài)線程池的設(shè)計(jì)與實(shí)踐分享

 更新時(shí)間:2025年05月07日 10:12:25   作者:Micro麥可樂(lè)  
在分布式系統(tǒng)架構(gòu)中,線程池是資源調(diào)度的重要工具,傳統(tǒng)固定參數(shù)的線程池在流量平穩(wěn)的場(chǎng)景下表現(xiàn)良好,但面對(duì)現(xiàn)代互聯(lián)網(wǎng)業(yè)務(wù)的潮汐流量特征時(shí),往往會(huì)出現(xiàn)資源浪費(fèi)或處理能力不足的問(wèn)題,所以本文將介紹基于Nacos實(shí)現(xiàn)動(dòng)態(tài)線程池的設(shè)計(jì)與實(shí)踐,需要的朋友可以參考下

1. 前言

在分布式系統(tǒng)架構(gòu)中,線程池是資源調(diào)度的重要工具。傳統(tǒng)固定參數(shù)的線程池在流量平穩(wěn)的場(chǎng)景下表現(xiàn)良好,但面對(duì)現(xiàn)代互聯(lián)網(wǎng)業(yè)務(wù)的潮汐流量特征時(shí),往往會(huì)出現(xiàn)資源浪費(fèi)或處理能力不足的問(wèn)題。

例如 電商促銷活動(dòng)期間訪問(wèn)量激增,正常時(shí)段則近乎空閑。固定線程池若過(guò)大,會(huì)在空閑期造成大量線程資源浪費(fèi);若過(guò)小,則在高峰期不能及時(shí)響應(yīng)請(qǐng)求,導(dǎo)致排隊(duì)或超時(shí)失敗。為此,為了保證高峰期的吞吐量與低谷期的資源利用率,我們需要一個(gè)能夠在運(yùn)行時(shí)根據(jù)業(yè)務(wù)負(fù)載自動(dòng)擴(kuò)容和收縮的線程池。

借助 Nacos 配置中心,我們可以將線程池的核心參數(shù)(如核心線程數(shù)、最大線程數(shù)、隊(duì)列容量、空閑回收時(shí)間等)下發(fā)到客戶端,并通過(guò)配置刷新實(shí)現(xiàn)熱更新,無(wú)需重啟應(yīng)用即可生效

2. 動(dòng)態(tài)線程池的使用背景分析

2.1 請(qǐng)求量波動(dòng)特點(diǎn)

  • 突發(fā)流量:業(yè)務(wù)系統(tǒng)可能在短時(shí)間內(nèi)接收到大量并發(fā)請(qǐng)求,如秒殺、團(tuán)購(gòu)等促銷活動(dòng),這時(shí)線程池需快速擴(kuò)容以保證響應(yīng)性能
  • 空閑期資源閑置:在夜間或業(yè)務(wù)低谷期,線程池中大量線程處于空閑狀態(tài),若不回收將浪費(fèi)內(nèi)存和 CPU 切換開(kāi)銷;

2.2 固定線程池的局限

  • 資源浪費(fèi)Executors.newFixedThreadPool(n) 在任何時(shí)刻都維護(hù) n 條線程,無(wú)法自動(dòng)回收空閑線程;
  • 響應(yīng)瓶頸:當(dāng)任務(wù)量超過(guò) n 時(shí),多余任務(wù)只能排隊(duì)等待,若排隊(duì)隊(duì)列又配置為有界,則可能直接拋棄或阻塞調(diào)用者;

2.3 動(dòng)態(tài)線程池優(yōu)勢(shì)

  • 自動(dòng)擴(kuò)容:當(dāng)任務(wù)提交速率超過(guò)核心線程數(shù)且隊(duì)列已滿時(shí),線程池會(huì)繼續(xù)創(chuàng)建新線程,直到達(dá)到最大線程數(shù)

  • 自動(dòng)收縮:通過(guò)調(diào)用 allowCoreThreadTimeOut(true),使得核心線程在空閑超過(guò) keepAliveTime 后也能被回收;

3. Nacos 依賴與啟動(dòng)配置

項(xiàng)目中引入 Spring Cloud Alibaba Nacos 依賴:

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  <version>2023.0.1.0</version>
</dependency>

在 application.yml 中配置 Nacos 服務(wù)器地址與應(yīng)用名:

spring:
  application:
    name: dynamic-threadpool-demo
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        refresh-enabled: true

在 Nacos 控制臺(tái)創(chuàng)建 Data ID:dynamic-threadpool-demo.yaml,內(nèi)容示例:

threadpool:
  coreSize: 5
  maxSize: 20
  queueCapacity: 100
  keepAliveSeconds: 60

該文件存儲(chǔ)線程池的各項(xiàng)參數(shù),后續(xù)可在控制臺(tái)直接修改并實(shí)時(shí)下發(fā)應(yīng)用實(shí)例

4. 初始化線程池并加載初始參數(shù)

定義線程池配置類,并使用 @ConfigurationProperties 讀取 Nacos 配置:

@Component
@RefreshScope
@ConfigurationProperties(prefix = "threadpool")
public class ThreadPoolProperties {
    private int coreSize;
    private int maxSize;
    private int queueCapacity;
    private long keepAliveSeconds;
    // getters & setters
}

在工廠類中注入 ThreadPoolProperties,并在配置變更時(shí)重建或調(diào)整現(xiàn)有線程池實(shí)例:

@Component
public class DynamicThreadPoolManager {
    private volatile ThreadPoolExecutor executor;
    private final ThreadPoolProperties props;

    public DynamicThreadPoolManager(ThreadPoolProperties props) {
        this.props = props;
        this.executor = createExecutor(props);
    }

    @NacosConfigListener(dataId = "${spring.application.name}.yaml", timeout = 5000)
    public void onChange(String newContent) throws JsonProcessingException {
        ThreadPoolProperties updated = new ObjectMapper()
            .readValue(newContent, ThreadPoolProperties.class);
        executor.setCorePoolSize(updated.getCoreSize());
        executor.setMaximumPoolSize(updated.getMaxSize());
        executor.setKeepAliveTime(updated.getKeepAliveSeconds(), TimeUnit.SECONDS);
        // 如果需要修改隊(duì)列容量,則重建 executor
    }

    private ThreadPoolExecutor createExecutor(ThreadPoolProperties p) {
        return new ThreadPoolExecutor(
            p.getCoreSize(), p.getMaxSize(),
            p.getKeepAliveSeconds(), TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(p.getQueueCapacity()),
            r -> new Thread(r, "dyn-pool-" + UUID.randomUUID()),
            new ThreadPoolExecutor.CallerRunsPolicy()
        );
    }

    public void submit(Runnable task) {
        executor.execute(task);
    }
}

啟動(dòng)測(cè)試,調(diào)用 CommandLineRunner 實(shí)現(xiàn)項(xiàng)目啟動(dòng)后執(zhí)行一些初始化操作。代碼如下:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner demo(DynamicThreadPoolManager manager) {
        return args -> {
            for (int i = 0; i < 50; i++) {
                int id = i;
                manager.submit(() -> {
                    System.out.println(Thread.currentThread().getName() + " - Task " + id);
                });
            }
        };
    }
}

5. 測(cè)試與驗(yàn)證

  • 啟動(dòng) Nacos Server 與該示例項(xiàng)目,觀察日志中線程池參數(shù)初始化信息
  • 修改 Nacos 中的參數(shù)(如 coreSize、maxSize),點(diǎn)擊刷新,應(yīng)用將自動(dòng)觸發(fā)回調(diào)并調(diào)整線程池設(shè)置,無(wú)需重啟
  • 可結(jié)合監(jiān)控工具(Prometheus/Grafana)對(duì) executor.getPoolSize()、getActiveCount()、getQueue().size() 等指標(biāo)進(jìn)行實(shí)時(shí)監(jiān)控與對(duì)比驗(yàn)證

6. 結(jié)語(yǔ)

通過(guò)將 Nacos 配置中心與 ThreadPoolExecutor 結(jié)合,我們成功實(shí)現(xiàn)了線程池參數(shù)的熱更新與動(dòng)態(tài)調(diào)整,滿足了高并發(fā)場(chǎng)景下的自動(dòng)擴(kuò)縮容需求。實(shí)踐中還進(jìn)一步延展到更多場(chǎng)景,如 消息隊(duì)列消費(fèi)者、異步任務(wù)執(zhí)行等,為微服務(wù)系統(tǒng)帶來(lái)更高的靈活性與可運(yùn)營(yíng)性。

以上就是基于Nacos實(shí)現(xiàn)動(dòng)態(tài)線程池的設(shè)計(jì)與實(shí)踐分享的詳細(xì)內(nèi)容,更多關(guān)于Nacos動(dòng)態(tài)線程池實(shí)現(xiàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JAVA設(shè)計(jì)模式之建造者模式原理與用法詳解

    JAVA設(shè)計(jì)模式之建造者模式原理與用法詳解

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之建造者模式,簡(jiǎn)單說(shuō)明了建造者模式的原理、組成,并結(jié)合實(shí)例形式分析了java建造者模式的定義與用法,需要的朋友可以參考下
    2017-08-08
  • 教你使用java實(shí)現(xiàn)去除各種空格

    教你使用java實(shí)現(xiàn)去除各種空格

    本文給大家匯總介紹了5種java中去除空格的方法,分別是String.trim()、str.replace(" ", "");、replaceAll(" +","");以及自定義的remove函數(shù),非常的簡(jiǎn)單實(shí)用,需要的小伙伴可以參考下。
    2015-03-03
  • Spring Boot 訪問(wèn)安全之認(rèn)證和鑒權(quán)詳解

    Spring Boot 訪問(wèn)安全之認(rèn)證和鑒權(quán)詳解

    這篇文章主要介紹了Spring Boot 訪問(wèn)安全之認(rèn)證和鑒權(quán),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 淺談Java源碼ConcurrentHashMap

    淺談Java源碼ConcurrentHashMap

    最近剛?cè)腴Tjava,覺(jué)得看源碼挺有意思的,就記錄一下一些常用類的源碼吧,從而能夠總結(jié)一些使用細(xì)節(jié).本文對(duì)源碼ConcurrentHashMap介紹的非常詳細(xì),對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • 如何實(shí)現(xiàn)自己的spring boot starter

    如何實(shí)現(xiàn)自己的spring boot starter

    這篇文章主要介紹了如何實(shí)現(xiàn)自己的spring boot starter,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Mybatis與Hibernate的區(qū)別

    Mybatis與Hibernate的區(qū)別

    以前沒(méi)怎么用過(guò)mybatis,只知道與hibernate一樣是個(gè)orm數(shù)據(jù)庫(kù)框架。隨著使用熟練度的增加,發(fā)現(xiàn)它與hibernate區(qū)別是非常大的感興趣的朋友通過(guò)本文一起學(xué)習(xí)吧
    2016-01-01
  • 詳解如何把Java中if-else代碼重構(gòu)成高質(zhì)量代碼

    詳解如何把Java中if-else代碼重構(gòu)成高質(zhì)量代碼

    這篇文章主要介紹了詳解如何把Java中if-else代碼重構(gòu)成高質(zhì)量代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Springboot+AOP實(shí)現(xiàn)返回?cái)?shù)據(jù)提示語(yǔ)國(guó)際化的示例代碼

    Springboot+AOP實(shí)現(xiàn)返回?cái)?shù)據(jù)提示語(yǔ)國(guó)際化的示例代碼

    這篇文章主要介紹了Springboot+AOP實(shí)現(xiàn)返回?cái)?shù)據(jù)提示語(yǔ)國(guó)際化的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Java并發(fā)編程中的ReentrantLock類詳解

    Java并發(fā)編程中的ReentrantLock類詳解

    這篇文章主要介紹了Java并發(fā)編程中的ReentrantLock類詳解,ReentrantLock是juc.locks包中的一個(gè)獨(dú)占式可重入鎖,相比synchronized,它可以創(chuàng)建多個(gè)條件等待隊(duì)列,還支持公平/非公平鎖、可中斷、超時(shí)、輪詢等特性,需要的朋友可以參考下
    2023-12-12
  • Mybatis如何使用ognl表達(dá)式實(shí)現(xiàn)動(dòng)態(tài)sql

    Mybatis如何使用ognl表達(dá)式實(shí)現(xiàn)動(dòng)態(tài)sql

    這篇文章主要介紹了Mybatis使用ognl表達(dá)式實(shí)現(xiàn)動(dòng)態(tài)sql的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

五寨县| 莱阳市| 香港 | 灵宝市| 右玉县| 和静县| 方城县| 达孜县| 北川| 绵竹市| 海宁市| 福贡县| 塔河县| 青岛市| 新泰市| 林芝县| 延长县| 阜宁县| 莲花县| 嘉定区| 成都市| 莱芜市| 东丰县| 崇文区| 保定市| 尖扎县| 岳池县| 米林县| 沂源县| 泉州市| 滦平县| 陆良县| 奇台县| 岚皋县| 宝鸡市| 崇信县| 罗甸县| 宜春市| 宿州市| 邹城市| 武强县|