你还在靠重启来调线程池?别人已经做到了实时调控,3分钟接入

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

池化思想是性能优化的一个重要思想,而线程池池化思想的代表。然而线程池的参数总是让无数开发者懊恼。虽然有有理论公式的参考,但是实际的部署情况千壤之别,老程序员只能通过经验来设置线程池的参数。

今天来介绍一款线程池监控工具,看看如何通过DynamicTp来破局。

02 简介

DynamicTpDromara 旗下的开源项目(GitHub4.8k+,Gitee2.5k+),针对上述痛点,提供零侵入、全链路、可观测的动态线程池解决方案。

官网地址:dynamictp.cn/

GitHub地址:github.com/dromara/dyn...

Gitee地址:gitee.com/dromara/dyn...

2.1 解决的痛点

使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢?

  • 代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适
  • 凭经验设置参数值,上线后发现需要调整,改代码重新发布服务,非常麻烦
  • 线程池相对开发人员来说是个黑盒,运行情况不能及时感知到,直到出现问题

DynamicTp获取可以帮助破局。

2.2 核心功能

  • 动态调参: 无需重启,运行时调整线程池参数,立即生效
  • 运行监控: 20+ 指标采集,支持 Micrometer、JMX、JsonLog 多方式暴露
  • 通知告警: 活性报警、队列阈值、拒绝触发、超时报警,支持企微/钉钉/飞书/邮件
  • 配置中心集成: 支持 Nacos、Apollo、Zookeeper、Consul、Etcd 等主流配置中心
  • 第三方组件统一管理: 内置 Tomcat、Jetty、Dubbo、RocketMQ、Grpc 等 15+ 组件线程池管理
  • SPI 扩展: 核心能力全部提供 SPI 接口,自由个性化扩展

技术上有美团线程池实践背书,已在多家企业生产环境验证。

03 接入

接入非常简单,4步走:

  1. 引入相应配置中心的依赖
  2. 配置中心配置线程池实例
  3. 启动类加 @EnableDynamicTp 注解
  4. 使用 @Resource 或 @Autowired 进行依赖注入,或通过 DtpRegistry.getExecutor("name") 获取

3.1 引入依赖

我们先使用无注册中心版本,SpringBoot3.x

xml 复制代码
<dependency>
    <groupId>org.dromara.dynamictp</groupId>
    <artifactId>dynamic-tp-spring-boot-starter-common</artifactId>
    <version>1.2.2-x</version>
</dependency>

3.2 配置

yaml 复制代码
spring:
  application:
    name: boot-dynamictp

# 暴露 actuator 端点,用于查看线程池监控
management:
  endpoints:
    web:
      exposure:
        include: "*"

# DynamicTp 无配置中心模式(本地配置文件,无动态调参,支持监控告警)
dynamictp:
  enabled: true
  enabledCollect: true
  collectorTypes: micrometer,logging
  monitorInterval: 5

  # 线程池配置
  executors:
    - threadPoolName: dtpExecutor1
      threadPoolAliasName: 测试线程池
      executorType: common
      corePoolSize: 4
      maximumPoolSize: 8
      queueCapacity: 200
      queueType: VariableLinkedBlockingQueue
      rejectedHandlerType: CallerRunsPolicy
      keepAliveTime: 60
      threadNamePrefix: dtp-test
      allowCoreThreadTimeOut: false
      waitForTasksToCompleteOnShutdown: true
      awaitTerminationSeconds: 5
      preStartAllCoreThreads: false
      notifyEnabled: true

3.3 修改启动类

3.4 案例

我们直接使用DtpRegistry的方式。

java 复制代码
@GetMapping("/info")
public String info() {
    DtpExecutor executor = DtpRegistry.getDtpExecutor("dtpExecutor1");
    return String.format(
            "线程池: %s | core=%d | max=%d | active=%d | queueSize=%d | queueRemaining=%d | completed=%d",
            executor.getThreadPoolName(),
            executor.getCorePoolSize(),
            executor.getMaximumPoolSize(),
            executor.getActiveCount(),
            executor.getQueue().size(),
            executor.getQueue().remainingCapacity(),
            executor.getCompletedTaskCount()
    );
}

3.5 启动测试

访问:http://localhost:8080/demo/info

访问:http://127.0.0.1:8080/actuator

访问:http://127.0.0.1:8080/actuator/dynamictp

就这么简单,接入已经完成了,正常的使用线程池即可。剩下的就交给DynamicTp

04 小结

本节只是介绍了基本的搭建以及入门,后面继续分享如何接入监控、通知报警等。

相关推荐
小张小张爱学习3 小时前
Java并发编程面试题
java·开发语言
码不停蹄的玄黓3 小时前
JDK 自带四大命令行工具:jstat、jstack、jmap、jhat 详解
java·开发语言
ch.ju3 小时前
Java程序设计(第3版)第四章——set方法为属性赋值
java·开发语言
IT_陈寒3 小时前
Redis客户端连接池不关闭的后果,程序直接崩给我看
前端·人工智能·后端
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第94题】【Mysql篇】第24题:什么是单路排序?什么是双路排序??
java·开发语言·数据库·mysql·面试·排序算法
我是一颗柠檬3 小时前
【Java项目技术亮点】多级缓存一致性方案:Canal+MQ实现数据库与缓存的最终一致
java·数据库·spring·缓存·kafka·rocketmq
于先生吖3 小时前
Java分账体系设计,网约车行程计费与到店线下结账一体化后端开发实战
java·开发语言
Solis程序员3 小时前
拿捏登录安全:RS256 + 双令牌,把非法请求拦在 Redis 白名单门外
java·安全·缓存·面试·bootstrap·html
thisiszdy3 小时前
<C++&C#> lambda表达式
java·c++·c#