热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开源动态可监控线程池DynamicTp介绍

前言使用线程池ThreadPoolExecutor过程中你是否有以下痛点呢?代码中创建了一个ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适凭经验设置

前言

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


    代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适

    凭经验设置参数值,上线后发现需要调整,改代码重新发布服务,非常麻烦

    线程池相对开发人员来说是个黑盒,运行情况不能及时感知到,直到出现问题


如果你有以上痛点,这块开源的动态可监控线程池框架(DynamicTp)或许能帮助到你

此项目由Dromara社区开源,基于配置中心的轻量级动态可监控线程池,项目地址:https://dynamictp.cn/



功能特性

代码零侵入:所有配置都放在配置中心,对业务代码零侵入

轻量简单:基于 springboot 实现,引入 starter,接入只需简单4步就可完成,顺利3分钟搞定

高可扩展:框架核心功能都提供 SPI 接口供用户自定义个性化实现(配置中心、配置文件解析、通知告警、监控数据采集、任务包装等等)

线上大规模应用:参考美团线程池实践open in new window,美团内部已经有该理论成熟的应用经验

多平台通知报警:提供多种报警维度(配置变更通知、活性报警、容量阈值报警、拒绝触发报警、任务执行或等待超时报警),已支持企业微信、钉钉、飞书报警,同时提供 SPI 接口可自定义扩展实现

监控:定时采集线程池指标数据,支持通过 MicroMeter、JsonLog 日志输出、Endpoint 三种方式,可通过 SPI 接口自定义扩展实现

任务增强:提供任务包装功能,实现TaskWrapper接口即可,如 MdcTaskWrapper、TtlTaskWrapper、SwTraceTaskWrapper,可以支持线程池上下文信息传递

兼容性:JUC 普通线程池和 Spring 中的 ThreadPoolTaskExecutor 也可以被框架监控,@Bean 定义时加 @DynamicTp 注解即可

可靠性:框架提供的线程池实现 Spring 生命周期方法,可以在 Spring 容器关闭前尽可能多的处理队列中的任务

多模式:参考Tomcat线程池提供了 IO 密集型场景使用的 EagerDtpExecutor 线程池

支持多配置中心:基于主流配置中心实现线程池参数动态调整,实时生效,已支持 Nacos、Apollo、Zookeeper、Consul、Etcd,同时也提供 SPI 接口可自定义扩展实现

中间件线程池管理:集成管理常用第三方组件的线程池,已集成Tomcat、Jetty、Undertow、Dubbo、RocketMq、Hystrix等组件的线程池管理(调参、监控报警)


系统架构图



接入指南


Maven 依赖

下面只介绍几个常用场景接入pom,zk、consul这些请查看官网


    apollo 应用用接入用此依赖



    cn.dynamictp

    dynamic-tp-spring-boot-starter-apollo

    1.0.8



    spring-cloud 场景下的 nacos 应用接入用此依赖



    cn.dynamictp

    dynamic-tp-spring-cloud-starter-nacos

    1.0.8



    非 spring-cloud 场景下的 nacos 应用接入用此依赖



    cn.dynamictp

    dynamic-tp-spring-boot-starter-nacos

    1.0.8



    注意版本:nacos-config-spring-boot-starter 0.2.10 及以下版本对应 springboot 2.3.12.RELEASE及以下版本, 0.2.11-beta及以上版本对应springboot 版本2.4.0及以上版本,具体看官方说明



配置文件

线程池定义可以配置在文件中,[email protected]@Autowire、或通过工具类来获取实例,以下配置文件,除了维护公共属性还定义了名称为austin.im.notice、execute-xxl-thread-pool线程池,其中格式支持yml、properties 类型、json 类型、zk文件

spring:

dynamic:

tp:

enabled: true

enabledBanner: true # 是否开启banner打印,默认true

enabledCollect: true # 是否开启监控指标采集,默认false

collectorType: micrometer # 监控数据采集器类型(JsonLog | MicroMeter),默认logging

monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s

apollo: # apollo配置,不配置默认拿apollo配置第一个namespace

namespace: dynamic-tp-apollo-dtp.yml

configType: yml

platforms:

- platform: wechat

urlKey: 38aa7eff500-1287

receivers: apollo

- platform: ding

urlKey: f80dad441fcd65bac48473d4a88dcd6a

secret: SECb544445a6a34f0315d08b17de41

receivers: 18888888888

executors:

- threadPoolName: austin.im.notice

corePoolSize: 6

maximumPoolSize: 8

queueCapacity: 200

queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类

rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类

keepAliveTime: 50

allowCoreThreadTimeOut: false

threadNamePrefix: austin- # 线程名前缀

- threadPoolName: execute-xxl-thread-pool

corePoolSize: 3

maximumPoolSize: 3

queueCapacity: 200

queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类

rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类

keepAliveTime: 50

allowCoreThreadTimeOut: false

threadNamePrefix: austin- # 线程名前缀

notifyItems: # 报警项,不配置自动会配置(变更通知、容量报警、活性报警、拒绝报警)

- type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类

enabled: true

threshold: 80 # 报警阈值

platforms: [ding,wechat] # 可选配置,不配置默认拿上层platforms配置的所以平台

interval: 120 # 报警间隔(单位:s)

- type: change

enabled: true

- type: liveness

enabled: true

threshold: 80

- type: reject

enabled: true

threshold: 1


代码使用


线程池实例定义

如果不再配置文件中进行定义,也可以在代码中直接定义

@Configuration

public class DtpConfig {
/**

* [email protected] DynamicTp} 注解定义普通juc线程池,会享受到该框架监控功能,注解名称优先级高于方法名

*

* @return 线程池实例

*/

@DynamicTp("commonExecutor")

@Bean

public ThreadPoolExecutor commonExecutor() {

return (ThreadPoolExecutor) Executors.newFixedThreadPool(1);

}
/**

* [email protected] ThreadPoolCreator} 快速创建一些简单配置的动态线程池

* tips: 建议直接在配置中心配置就行,[email protected]

*

* @return 线程池实例

*/

@Bean

public DtpExecutor dtpExecutor1() {

return ThreadPoolCreator.createDynamicFast("dtpExecutor1");

}
/**

* [email protected] ThreadPoolBuilder} 设置详细参数创建动态线程池(推荐方式),

* ioIntensive,参考tomcat线程池设计,实现了处理io密集型任务的线程池,具体参数可以看代码注释

*

* tips: 建议直接在配置中心配置就行,[email protected]

* @return 线程池实例

*/

@Bean

public DtpExecutor ioIntensiveExecutor() {

return ThreadPoolBuilder.newBuilder()

.threadPoolName("ioIntensiveExecutor")

.corePoolSize(20)

.maximumPoolSize(50)

.queueCapacity(2048)

.ioIntensive(true)

.buildDynamic();

}
/**

* tips: 建议直接在配置中心配置就行,[email protected]

* @return 线程池实例

*/

@Bean

public ThreadPoolExecutor dtpExecutor2() {

return ThreadPoolBuilder.newBuilder()

.threadPoolName("dtpExecutor2")

.corePoolSize(10)

.maximumPoolSize(15)

.keepAliveTime(50)

.timeUnit(TimeUnit.MILLISECONDS)

.workQueue(QueueTypeEnum.SYNCHRONOUS_QUEUE.getName(), null, false)

.waitForTasksToCompleteOnShutdown(true)

.awaitTerminationSeconds(5)

.buildDynamic();

}

}


代码调用

从DtpRegistry中根据线程池名称获取,或者通过依赖注入方式(推荐,更优雅)


    依赖注入方式使用,优先推荐依赖注入方式,不能使用依赖注入的场景可以使用方式2

@Resource

private ThreadPoolExecutor dtpExecutor1;
public void exec() {

dtpExecutor1.execute(() -> System.out.println("test"));

}


    通过DtpRegistry注册器获取

public static void main(String[] args) {

DtpExecutor dtpExecutor = DtpRegistry.getDtpExecutor("dtpExecutor1");

dtpExecutor.execute(() -> System.out.println("test"));

}


通知报警


调参通知



运行报警


线程池活跃度告警

活跃度 = activeCount / maximumPoolSize



队列容量告警

容量使用率 = queueSize / queueCapacity



拒绝策略告警

线程池线程数达到配置的最大线程数,且任务队列已满,再提交任务会触发拒绝策略



任务队列超时告警

重写ThreadPoolExecutor的execute()方法和beforeExecute()方法,如果配置了执行超时或排队超时值,则会进行报警


任务执行超时告警

重写ThreadPoolExecutor的afterExecute()方法,根据当前时间和beforeExecute()中设置的startTime的差值即可算出任务的实际执行时间,然后判断如果差值大于配置的runTimeout则累加排队超时任务数量,则会进行告警


监控

支持接入prometheus+grafana做监控,效果如下



总结

DynamicTcp是一个功能实用,上手简单动态线程池组件,很轻量对业务无侵入,目前我们业务系统已经开始介入,读者朋友们赶紧使用起来吧。


开源动态可监控线程池DynamicTp介绍的相关教程结束。



推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • python限制递归次数(python最大公约数递归)
    本文目录一览:1、python为什么要进行递归限制 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
浮云
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有