Giter VIP home page Giter VIP logo

dromara / dynamic-tp Goto Github PK

View Code? Open in Web Editor NEW
3.4K 48.0 710.0 15.63 MB

🔥🔥🔥轻量级动态线程池,内置监控告警功能,集成三方中间件线程池管理,基于主流配置中心(已支持Nacos、Apollo,Zookeeper、Consul、Etcd,可通过SPI自定义实现)。Lightweight dynamic threadpool, with monitoring and alarming functions, base on popular config centers (already support Nacos、Apollo、Zookeeper、Consul, can be customized through SPI).

Home Page: https://dynamictp.cn

License: Apache License 2.0

Java 96.84% Lua 0.03% HTML 2.92% C++ 0.20%
java dynamic-threadpool spring nacos apollo micrometer consul springcloud threadpool threadpoolexecutor

dynamic-tp's People

Contributors

abbottliu avatar androidcj avatar bantanger avatar bwcx-jzy avatar dailingx avatar duncanplayer avatar fabian4 avatar future94 avatar grmrb avatar hdgaadd avatar kamtohung avatar kimihrio avatar loongs-zhang avatar luchunhui2056 avatar nothingimposible avatar peachyy avatar piemon-nyah avatar redick01 avatar ruoan777 avatar topsuder avatar trevzhang avatar wenpanwenpan avatar wetool19 avatar windsearcher avatar yanhom1314 avatar yanhom9527 avatar yaofly avatar yuexiaying avatar zjbshk avatar zslxbl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dynamic-tp's Issues

使用log4j2的日志应用,引入dynamic-tp starter之后项目起不来

项目上使用的是log4j2的日志,排除了logback相关的依赖,但是dynamic-tp-logging模块又引入了logback的相关依赖,导致和log4j2的冲突,而且DtpLogging里面硬编码引入了logback的包,这边建议可以支持logback和log4j2两种依赖,还有就是DtpLoggingListener类里面有个判断逻辑是判断项目是不是有cloud环境,我们就是用的apllo没有cloud环境,这块是否也可以优化,比如sources.contains()里面的值直接用上面反射得到的结果代替
PA1UNQ86WD3R _G6Y9AOU`P

Monitor thread does not execute!

Because the implementation of different versions of Tomcat thread pool is different, an error is reported when the thread pool parameters cannot be obtained

If an error is reported in the thread pool scheduling method, the thread pool will not be scheduled

线程池对象创建的问题

能否实现,自动根据配置中心配置好的参数,项目启动时自动创建好线程池,并且可以使用@resuce注入。配置好参数,无需添加任何构造代码,即可立即使用

谁在使用DynamicTp

谁在使用DynamicTp

非常感谢每一位关注和使用DynamicTp的小伙伴们,为了让项目更好的发展,社区更加活跃,麻烦大家在此登记一下,有兴趣的小伙伴可以加入一起贡献、完善项目

参考格式

  • 所在公司、组织等
  • 公司官网
  • 所在城市(可选)
  • 联系方式,邮箱、微信等(可选)
  • 使用场景(可选)
  • 使用环境,线上、测试等(可选)
  • 使用规模,服务、实例等(可选)
  • 版本

示例

  • 公司:pwrd
  • 官网:https://www.pwrd.com/
  • 城市:北京
  • 联系方式:yanhom1314(微信)
  • 使用场景:动态调整线程池参数、监控、告警
  • 使用环境:线上
  • 使用规模:20+服务,60+线程池实例
  • 版本:1.1.5

配置文件配置的线程池和Spring容器中用代码生成的线程池名字一样时覆盖的疑问

看代码发现如果配置文件配置的线程池和Spring容器中用代码配置的线程池名字一样时,注册的线程池对象会被设置成由配置文件生成的线程池对象(配置文件创建的对象并没有被容器管理),这样的话Spring容器中的创建的线程池对象其实没有被监控也无法动态配置,这样设计的原因是什么?谢谢!

问题反馈模板

首先感谢使用 DynamicTp,如果使用过程中有任何问题,请按照下述模板反馈问题,建议使用 Markdown 语法

参考格式

  • SpringBoot 版本
  • DynamicTp 版本
  • 配置中心类型
  • 问题描述
  • 使用截图(配置中心配置文件、项目配置文件、代码使用、报错信息等)

告警信息重复发送

同一线程池,同一告警类型,同一时间收到多条告警信息,多线程并发问题,已加线程同步逻辑

preStartAllCoreThreads=true不生效问题

各位大神好,在测试该1.0.7版本时,发现个小问题,描述如下:

在使用ThreadPoolBuilder创建DtpExecutor时,设置了preStartAllCoreThreads=true ,期望能提前启动核心线程,代码如下:
ThreadPoolBuilder.newBuilder()
.threadFactory("dtpExecutor1")
.threadPoolName("dtpExecutor1")
.corePoolSize(128)
.maximumPoolSize(256)
.keepAliveTime(60)
.timeUnit(TimeUnit.SECONDS)
.rejectedExecutionHandler("CallerRunsPolicy")
.preStartAllCoreThreads(true)
.workQueue(QueueTypeEnum.VARIABLE_LINKED_BLOCKING_QUEUE.getName(), 128, false)
.buildDynamic();

但由于 DtpExecutor的构造器参数未接收preStartAllCoreThreads参数,导致preStartAllCoreThreads=false无法预启动核心线程。
public DtpExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
this.rejectHandlerName = handler.getClass().getSimpleName();
RejectedExecutionHandler rejectedExecutionHandler = RejectHandlerGetter.getProxy(handler);
setRejectedExecutionHandler(rejectedExecutionHandler);

    if (preStartAllCoreThreads) {
        prestartAllCoreThreads();
    }
}      

目前的解决方案是构建好DtpExecutor后,手动调用prestartAllCoreThreads()方法。

这是一款非常不错的开源框架,希望大神们能修复掉这个小BUG,力争成为优秀开源框架。

AlarmLimiter.getAlarmLimitInfo Npe 问题修复

Npe 问题修复

输入图片说明

2022-09-16 15:03:44.533 ERROR 2914 --- [dtp-alarm-2] com.dtp.core.thread.NamedThreadFactory : thread Thread[dtp-alarm-2,5,main] throw exception {}

java.lang.NullPointerException: null
at com.dtp.core.notify.alarm.AlarmLimiter.getAlarmLimitInfo(AlarmLimiter.java:43) ~[dynamic-tp-core-1.0.8.jar!/:1.0.8]
at com.dtp.core.notify.alarm.AlarmLimiter.ifAlarm(AlarmLimiter.java:48) ~[dynamic-tp-core-1.0.8.jar!/:1.0.8]
at com.dtp.core.notify.filter.AlarmBaseFilter.doFilter(AlarmBaseFilter.java:40) ~[dynamic-tp-core-1.0.8.jar!/:1.0.8]
at com.dtp.core.notify.filter.AlarmBaseFilter.doFilter(AlarmBaseFilter.java:20) ~[dynamic-tp-core-1.0.8.jar!/:1.0.8]
at com.dtp.common.pattern.filter.FilterChainFactory$1.invoke(FilterChainFactory.java:24) ~[dynamic-tp-common-1.0.8.jar!/:1.0.8]
at com.dtp.common.pattern.filter.FilterChain.fire(FilterChain.java:14) ~[dynamic-tp-common-1.0.8.jar!/:1.0.8]
at com.dtp.core.notify.alarm.AlarmManager.doAlarm(AlarmManager.java:104) ~[dynamic-tp-core-1.0.8.jar!/:1.0.8]
at com.dtp.core.notify.alarm.AlarmManager.doAlarm(AlarmManager.java:93) ~[dynamic-tp-core-1.0.8.jar!/:1.0.8]

通知告警支持集群维度频控

目前通知告警是基于单机维度做的频控,在集群机器数量很多的情况下会产生很多的通知告警信息,需要按服务做集群维度频控,考虑在extension模块下添加可选插件实现(比如基于redis、zk等),然后用责任链模式改造notify模块,执行发送前走filter链过滤。

设计问题

请问MicroMeterCollector为何自己维护监控数据(GAUGE_CACHE),这样设计,我认为有两点小瑕疵:
1、需要创建定时任务(DtpMonitor#run),来更新GAUGE_CACHE。
2、如果定时任务的刷新时间monitorInterval与promethues配置的拉取时间不一致,可能会产生数据误差。

我的想法是,注册gauge的时候,直接传入线程池(或其监控数据获取包装类),这样,每当MetricRegistry想要获取监控数据时(触发线程池监控数据包装类::getCorePoolSize等操作),可以获取到最新的数据。

本人水平尚浅,可能思考不到位,还请大佬们赐教,谢谢。

线程池配置(properties 类型):修改属性变更除第一次,后续接着修改不生效或多次修改间隔生效

SpringBoot 版本 : DT 1.0.8 默认自带的
DynamicTp 版本:1.0.8
配置中心类型: Apollo (properties 单独namespace配置)
问题描述:
yml格式每次修改,都能实时生效并Alert通知;properties 格式测试验证有BUG,修改属性变更除第一次,后续接着修改不生效或多次修改间隔生效(比如说反复修改executors[0].corePoolSize或executors[0].maximumPoolSize、executors[0].queueCapacity等的值)。

使用截图(配置中心配置文件、项目配置文件、代码使用、报错信息等)
spring.dynamic.tp.enabled = true
spring.dynamic.tp.enabledBanner = true
spring.dynamic.tp.enabledCollect = true
spring.dynamic.tp.collectorTypes = logging,micrometer
spring.dynamic.tp.logPath = /logs
spring.dynamic.tp.monitorInterval = 20
spring.dynamic.tp.apollo.namespace = 2B.dynamic-tp
spring.dynamic.tp.configType = properties
spring.dynamic.tp.platforms[0].platform = ding
spring.dynamic.tp.platforms[0].urlKey = ******
spring.dynamic.tp.platforms[0].secret = *****
spring.dynamic.tp.platforms[0].receivers = ******
spring.dynamic.tp.executors[0].threadPoolName = dtpExecutor1
spring.dynamic.tp.executors[0].executorType = common
spring.dynamic.tp.executors[0].corePoolSize = 30
spring.dynamic.tp.executors[0].maximumPoolSize = 80
spring.dynamic.tp.executors[0].queueCapacity = 1000
spring.dynamic.tp.executors[0].queueType = VariableLinkedBlockingQueue
spring.dynamic.tp.executors[0].rejectedHandlerType = CallerRunsPolicy
spring.dynamic.tp.executors[0].keepAliveTime = 50
spring.dynamic.tp.executors[0].allowCoreThreadTimeOut = false
spring.dynamic.tp.executors[0].threadNamePrefix = dt-test1
spring.dynamic.tp.executors[0].waitForTasksToCompleteOnShutdown = true
spring.dynamic.tp.executors[0].awaitTerminationSeconds = 30
spring.dynamic.tp.executors[0].preStartAllCoreThreads = false
spring.dynamic.tp.executors[0].runTimeout = 200
spring.dynamic.tp.executors[0].queueTimeout = 100
spring.dynamic.tp.executors[0].taskWrapperNames = ttl
spring.dynamic.tp.executors[0].notifyItems[0].type = capacity
spring.dynamic.tp.executors[0].notifyItems[0].enabled = true
spring.dynamic.tp.executors[0].notifyItems[0].threshold = 80
spring.dynamic.tp.executors[0].notifyItems[0].platforms = ding
spring.dynamic.tp.executors[0].notifyItems[0].interval = 120
spring.dynamic.tp.executors[0].notifyItems[1].type = change
spring.dynamic.tp.executors[0].notifyItems[1].enabled = true
spring.dynamic.tp.executors[0].notifyItems[2].type = liveness
spring.dynamic.tp.executors[0].notifyItems[2].enabled = true
spring.dynamic.tp.executors[0].notifyItems[2].threshold = 80
spring.dynamic.tp.executors[0].notifyItems[3].type = reject
spring.dynamic.tp.executors[0].notifyItems[3].enabled = true
spring.dynamic.tp.executors[0].notifyItems[3].threshold = 1
spring.dynamic.tp.executors[0].notifyItems[4].type = run_timeout
spring.dynamic.tp.executors[0].notifyItems[4].enabled = true
spring.dynamic.tp.executors[0].notifyItems[4].threshold = 1
spring.dynamic.tp.executors[0].notifyItems[5].type = queue_timeout
spring.dynamic.tp.executors[0].notifyItems[5].enabled = true
spring.dynamic.tp.executors[0].notifyItems[5].threshold = 1
spring.dynamic.tp.executors[1].threadPoolName = defaultThreadExcutor
spring.dynamic.tp.executors[1].corePoolSize = 20
spring.dynamic.tp.executors[1].maximumPoolSize = 30
spring.dynamic.tp.executors[1].queueCapacity = 1000
spring.dynamic.tp.executors[1].queueType = VariableLinkedBlockingQueue
spring.dynamic.tp.executors[1].rejectedHandlerType = CallerRunsPolicy
spring.dynamic.tp.executors[1].keepAliveTime = 50
spring.dynamic.tp.executors[1].allowCoreThreadTimeOut = false
spring.dynamic.tp.executors[1].threadNamePrefix = default-thread-pool

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.