业务实战场景(十七)动态线程池技术方案

2023-01-07  本文已影响0人  后来丶_a24d

目录


系列总目录


背景


简单实现

@Configuration
public class DynamicThreadPool implements InitializingBean {
   @Override
    public void afterPropertiesSet() throws Exception {
        // 按照配置中心初始化线程池,这里简单举例nacos
        threadPoolExecutor = new ThreadPoolExecutor(Integer.parseInt(coreSize), Integer.parseInt(maxSize), 10L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(10),
                new ThreadFactoryBuilder().setNameFormat("c_t_%d").build(),
                new RejectedExecutionHandler() {
                    @Override
                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                        System.out.println("rejected!");
                    }
                });
 
        // 根据配置变更监听从而改变线程池参数,这里举例nacos,apollo思路也是一样只是api不同
        nacosConfigManager.getConfigService().addListener("order-service-dev.yml", nacosConfigProperties.getGroup(),
                new Listener() {
                    @Override
                    public Executor getExecutor() {
                        return null;
                    }
 
                    @Override
                    public void receiveConfigInfo(String configInfo) {
                        //配置变更,修改线程池配置
                        System.out.println(configInfo);
                        changeThreadPoolConfig(Integer.parseInt(coreSize);
                    }
                });
    }
   /**
     * 修改线程池核心参数
     *
     * @param coreSize
     * @param maxSize
     */
    private void changeThreadPoolConfig(int coreSize) {
        threadPoolExecutor.setCorePoolSize(coreSize);
    }
}

美团开源方案DynamicTp

架构

监控模块
  1. 默认实现 JsonLog 输出到磁盘,可以自己采集解析日志,存储展示,比如Flume采集日志到Kafka,然后Kafka分析
  2. MicroMeter采集,引入 MicroMeter 相关依赖,暴露相关端点,采集指标数据,结合 Grafana 做监控大盘,默认这种模式
  3. 暴露自定义 Endpoint 端点(dynamic-tp),可通过 http 方式实时访
通知告警模块

特性

  1. 代码零侵入
  2. 通知告警
  3. 运行监控
  4. 任务增强, 支持上下文传递
  5. 多配置中心支持,Nacos、Apollo、Zookeeper、Consul、Etcd
  6. 中间件线程池管理
[
    {
        "dtp_name": "remoting-call",
        "core_pool_size": 6,
        "maximum_pool_size": 12,
        "queue_type": "SynchronousQueue",
        "queue_capacity": 0,
        "queue_size": 0,
        "fair": false,
        "queue_remaining_capacity": 0,
        "active_count": 0,
        "task_count": 21760,
        "completed_task_count": 21760,
        "largest_pool_size": 12,
        "pool_size": 6,
        "wait_task_count": 0,
        "reject_count": 124662,
        "reject_handler_name": "CallerRunsPolicy"
    }
]

参考文章

上一篇 下一篇

猜你喜欢

热点阅读