DynamicTp 是一个基于 配置中心(如Nacos、Apollo、Zookeeper等)的 动态线程池 管理框架,旨在优化Java应用中的线程池使用,解决传统线程池配置僵化、难以动态调整的问题。它能够在不重启应用的情况下,实时调整线程池参数(如核心线程数、最大线程数、队列容量等),并提供了丰富的监控和告警功能。 官网
动态调参 在运行时动态调整线程池参数,包括核心线程数、最大线程数、空闲线程超时时间、任务队列大小等
通知报警 目前支持调参通知、活性、队列容量、拒绝策略、超时共六类通知报警维度,在运行时实时+定时检测,触发阈值进行推送
运行监控 定时采集线程池运行指标数据,提供 jsonlog、micrometer、endpoint、jmx 四种指标数据采集方式,可灵活选择
三方包集成 集成三方中间件线程池管理,已接入dubbo、rocketmq、hystrix、grpc、tomcat、undertow、jetty、grpc、okhttp等组件线程池管理
突发流量应对:高峰期自动扩容线程池,低谷期缩容以节省资源。
避免任务堆积:动态调整队列容量或拒绝策略,防止OOM。
统一管理:集中监控多个微服务的线程池状态。
nacos为注册中心
xmlSpringBoot1x、2x 用此依赖
<dependency>
<groupId>org.dromara.dynamictp</groupId>
<artifactId>dynamic-tp-spring-cloud-starter-nacos</artifactId>
<version>1.2.2</version>
</dependency>
SpringBoot3x 用此依赖
<dependency>
<groupId>org.dromara.dynamictp</groupId>
<artifactId>dynamic-tp-spring-cloud-starter-nacos</artifactId>
<version>1.2.2-x</version>
</dependency>
线程池配置文件
ymldynamictp:
enabled: true # 是否启用 dynamictp,默认true
enabledCollect: true # 是否开启监控指标采集,默认true
collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging | JMX),默认micrometer
logPath: /home/logs/dynamictp/user-center/ # 监控日志数据路径,默认 ${user.home}/logs,采集类型非logging不用配置
monitorInterval: 5 # 监控时间间隔(报警检测、指标采集),默认5s
# 告警渠道
platforms: # 通知报警平台配置
- platform: wechat
platformId: 1 # 平台id,自定义
urlKey: 3a700-127-4bd-a798-c53d8b69c # webhook 中的 key
receivers: test1,test2 # 接受人企微账号
- platform: ding
platformId: 2 # 平台id,自定义
urlKey: f80dad441fcd655438f4a08dcd6a # webhook 中的 access_token
secret: SECb5441fa6f375d5b9d21 # 安全设置在验签模式下才的秘钥,非验签模式没有此值
receivers: 18888888888 # 钉钉账号手机号
- platform: lark
platformId: 3
urlKey: 0d944ae7-b24a-40 # webhook 中的 token
secret: 3a750012874bdac5c3d8b69c # 安全设置在签名校验模式下才的秘钥,非验签模式没有此值
receivers: test1,test2 # 接受人username / openid
- platform: email
platformId: 4
receivers: 123456@qq.com,789789@qq.com # 收件人邮箱,多个用逗号隔开
# 全局配置
globalExecutorProps: # 线程池配置 > 全局配置 > 字段默认值
rejectedHandlerType: CallerRunsPolicy
queueType: VariableLinkedBlockingQueue
waitForTasksToCompleteOnShutdown: true
awaitTerminationSeconds: 3
taskWrapperNames: ["swTrace", "ttl", "mdc"]
queueTimeout: 300
runTimeout: 300
notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警)
- type: change # 线程池核心参数变更通知
silencePeriod: 120 # 通知静默时间(单位:s),默认值1,0表示不静默
- type: capacity # 队列容量使用率,报警项类型,查看源码 NotifyTypeEnum枚举类
threshold: 80 # 报警阈值,意思是队列使用率达到70%告警;默认值=70
count: 2 # 在一个统计周期内,如果触发阈值的数量达到 count,则触发报警;默认值=1
period: 30 # 报警统计周期(单位:s),默认值=120
silencePeriod: 0 # 报警静默时间(单位:s),0表示不静默,默认值=120
- type: liveness # 线程池活性
threshold: 80 # 报警阈值,意思是活性达到70%告警;默认值=70
count: 3 # 在一个统计周期内,如果触发阈值的数量达到 count,则触发报警;默认值=1
period: 30 # 报警统计周期(单位:s),默认值=120
silencePeriod: 0 # 报警静默时间(单位:s),0表示不静默;默认值=120
- type: reject # 触发任务拒绝告警
count: 1 # 在一个统计周期内,如果触发拒绝策略次数达到 count,则触发报警;默认值=1
period: 30 # 报警统计周期(单位:s),默认值=120
silencePeriod: 0 # 报警静默时间(单位:s),0表示不静默;默认值=120
- type: run_timeout # 任务执行超时告警
count: 20 # 在一个统计周期内,如果执行超时次数达到 count,则触发报警;默认值=10
period: 30 # 报警统计周期(单位:s),默认值=120
silencePeriod: 30 # 报警静默时间(单位:s),0表示不静默;默认值=120
- type: queue_timeout # 任务排队超时告警
count: 5 # 在一个统计周期内,如果排队超时次数达到 count,则触发报警;默认值=10
period: 30 # 报警统计周期(单位:s),默认值=120
silencePeriod: 0 # 报警静默时间(单位:s),0表示不静默;默认值=120
# 线程池配置
executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量
- threadPoolName: dtpExecutor1 # 线程池名称,必填
threadPoolAliasName: 测试线程池 # 线程池别名,可选
executorType: common # 线程池类型 common、eager、ordered、scheduled、priority,默认 common
corePoolSize: 6 # 核心线程数,默认1
maximumPoolSize: 8 # 最大线程数,默认cpu核数
queueCapacity: 2000 # 队列容量,默认1024
queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类,默认VariableLinkedBlockingQueue
rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类,默认AbortPolicy
keepAliveTime: 60 # 空闲线程等待超时时间,默认60
threadNamePrefix: test # 线程名前缀,默认dtp
allowCoreThreadTimeOut: false # 是否允许核心线程池超时,默认false
waitForTasksToCompleteOnShutdown: true # 参考spring线程池设计,优雅关闭线程池,默认true
awaitTerminationSeconds: 5 # 优雅关闭线程池时,阻塞等待线程池中任务执行时间,默认3,单位(s)
preStartAllCoreThreads: false # 是否预热所有核心线程,默认false
runTimeout: 200 # 任务执行超时阈值,单位(ms),默认0(不统计)
queueTimeout: 100 # 任务在队列等待超时阈值,单位(ms),默认0(不统计)
tryInterrupt: false # 执行超时后是否中断线程,默认false
taskWrapperNames: ["ttl", "mdc"] # 任务包装器名称,继承TaskWrapper接口
notifyEnabled: true # 是否开启报警,默认true
platformIds: [1,2] # 报警平台id,不配置默认拿上层platforms配置的所有平台
ymlspring:
application:
name: user-center
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yml
extension-configs:
- dataId: ${spring.application.name}-dtp-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
group: DEFAULT_GROUP
refresh: true # 必须配置,否则自动刷新不生效
refresh-enabled: true
java@Resource
private ThreadPoolExecutor dtpExecutor1; // 注入动态线程池
dtpExecutor1.execute(() -> System.out.println("DynamicTp任务执行"));
本文作者:Weee
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!