动态线程池 v1.2.1 版本发布,告警规则重构,bytebuddy 替换 cglib,新增 jmh 基准测试等!

DynamicTp 简介

DynamicTp 是一款基于配置中心的轻量级动态线程池监控管理工具,主要功能可以总结为动态调参、通知报警、运行监控、三方包线程池管理等几大类。

DynamicTp 特性

经过多个版本的迭代,目前最新版本 v1.2.1 具有以下特性

v1.2.1 升级注意事项

  • DtpEndpoint 端点名称修改

实时指标监控端点名称从 dynamic-tp 修改为 dynamictp,消除 springboot 的非法字符 warn 警告。

  • 告警规则重构

v1.2.1 之前版本里告警规则比较简单,通过 thresholdinterval 字段来控制。

yml 复制代码
dynamictp:
  # 全局配置
  globalExecutorProps:                        # 线程池配置 > 全局配置 > 字段默认值
    rejectedHandlerType: CallerRunsPolicy
    queueType: VariableLinkedBlockingQueue
    waitForTasksToCompleteOnShutdown: true
    awaitTerminationSeconds: 3
    taskWrapperNames: ["swTrace", "ttl", "mdc"]
    queueTimeout: 300
    runTimeout: 300
    notifyItems:                     # 报警项,不配置自动会按默认值(查看源码NotifyItem类)配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警)
      - type: change
        interval: 10

      - type: capacity               # 队列容量使用率,报警项类型,查看源码 NotifyTypeEnum枚举类
        threshold: 80                # 报警阈值,默认70,意思是队列使用率达到70%告警
        interval: 120                # 报警间隔(单位:s),默认120

      - type: liveness               # 线程池活性
        threshold: 80                # 报警阈值,默认 70,意思是活性达到70%告警
        interval: 120

      - type: reject                 # 触发任务拒绝告警
        threshold: 1               # 默认阈值10
        interval: 120

      - type: run_timeout            # 任务执行超时告警
        threshold: 100               # 默认阈值10
        interval: 120

      - type: queue_timeout          # 任务排队超时告警
        threshold: 100               # 默认阈值10
        interval: 120

比如对于 capacity 项:语义为当线程池队列容量达到 80%时触发一次告警,告警后 120s 内再产生的报警保持静默。

设计的比较草率,有几个问题:

  • 数据统计需要限定在一定的时间窗口内,过期需重新计数,此处 interval 只用在了静默处理上,没统计窗口的概念

  • 只要阈值达到了就会产生一次报警,更好的做法应该是达到阈值的次数达到某个值才算一个异常,触发一次报警

  • 无效告警多,静默不能关闭

在 v1.2.1 版本里,我们重构了告警规则,引入 thresholdcountperiodsilencePeriod 四个配置字段。

目前的告警语义:对于某一个告警项,在一定的统计窗口(period)内,达到阈值(threshold)的次数达到某个值(count)时才算为一个有效的异常,触发一次报警。告警后(silencePeriod)内再产生的报警保持静默,且静默可以关闭。

yml 复制代码
dynamictp:
  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

v1.2.1 发版记录

Feature

  • 新增 jmh benchmark 基准测试模块。
xml 复制代码
https://github.com/dromara/dynamic-tp/pull/545

Refactor

  • 移除 cglib,动态代理采用 bytebuddy 重构。
xml 复制代码
https://github.com/dromara/dynamic-tp/pull/538
  • 重构告警规则,减少无用告警,告警更可控。
xml 复制代码
https://github.com/dromara/dynamic-tp/pull/553
  • 实时监控指标暴露的端点名称从 dynamic-tp 修改为 dynamictp,消除 springboot 的 warn 警告
xml 复制代码
https://github.com/dromara/dynamic-tp/pull/542

Bugfix

  • 修复 springboot devtool restart 后 DtpMonitor 中线程池被关闭报错拒绝任务问题。
xml 复制代码
https://github.com/dromara/dynamic-tp/pull/529
  • 修复如果未引入 jackson-datatype-jsr310 会导致 jackson 异常并且无提示问题。
xml 复制代码
https://github.com/dromara/dynamic-tp/pull/534
  • 优化潜在的 NPE 异常。
xml 复制代码
https://github.com/dromara/dynamic-tp/pull/537

以上就是本次发版的全部内容。欢迎大家升级体验!

看到这儿,方便的话给项目一个 star,你的支持是我们前进的动力!

使用过程中有任何问题,或者对项目有什么想法或者建议,可以加入社群,跟 1700+ 群友一起交流讨论。

项目地址

shell 复制代码
官网:https://dynamictp.cn

gitee:https://gitee.com/dromara/dynamic-tp

github:https://github.com/dromara/dynamic-tp

gitcode:https://gitcode.com/dromara/dynamic-tp
相关推荐
小莫分享6 分钟前
2023年最新总结,阿里,腾讯,百度,美团,头条等技术面试题目,以及答案,专家出题人分析汇总。
java·后端·面试·职场和发展
Brookty8 分钟前
【操作系统】线程
java·linux·服务器·后端·学习·java-ee·操作系统
Dovis(誓平步青云)10 分钟前
探索飞算 JavaAI 进阶:解锁高效Java开发的新维度
java·开发语言·飞算java
源码云商10 分钟前
基于 SpringBoot + Vue 的 IT 技术交流和分享平台的设计与实现
vue.js·spring boot·后端
小雪_Snow16 分钟前
多态 使用场景
java
程序员爱钓鱼1 小时前
Go语言实战案例-简易计算器(加减乘除)
后端
学不会就看1 小时前
Django--01基本请求与响应流程
后端·python·django
胚芽鞘6815 小时前
关于java项目中maven的理解
java·数据库·maven
岁忧6 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
CJi0NG6 小时前
【自用】JavaSE--算法、正则表达式、异常
java