美团动态线程池实践思路,开源了

2022-04-21 14:29:50 +08:00
 yanhomlin

大家好,今天我们来聊一个比较实用的话题,动态可监控的线程池实践,全新开源项目(DynamicTp)地址在下方,欢迎 star 交流学习。


项目地址

gitee 地址https://gitee.com/yanhom/dynamic-tp

github 地址https://github.com/lyh200/dynamic-tp


系列文章

动态线程池框架( DynamicTp ),监控及源码解析篇

动态线程池( DynamicTp )之动态调整 Tomcat 、Jetty 、Undertow 线程池参数篇

美团动态线程池实践思路开源项目( DynamicTp ),线程池源码解析及通知告警篇


写在前面

稍微有些 Java 编程经验的小伙伴都知道,Java 的精髓在 juc 包,这是大名鼎鼎的 Doug Lea 老爷 子的杰作,评价一个程序员 Java 水平怎么样,一定程度上看他对 juc 包下的一些技术掌握的怎么样,这也是面试中的基本上必问的一些技术点之一。

juc 包主要包括:

1.原子类( AtomicXXX )

2.锁类( XXXLock )

3.线程同步类( AQS 、CountDownLatch 、CyclicBarrier 、Semaphore 、Exchanger )

4.任务执行器类( Executor 体系类,包括今天的主角 ThreadPoolExecutor )

5.并发集合类( ConcurrentXXX 、CopyOnWriteXXX )相关集合类

6.阻塞队列类( BlockingQueue 继承体系类)

7.Future 相关类

8.其他一些辅助工具类

多线程编程场景下,这些类都是必备技能,会这些可以帮助我们写出高质量、高性能、少 bug 的代码,同时这些也是 Java 中比较难啃的一些技术,需要持之以恒,学以致用,在使用中感受他们带来的奥妙。

上边简单罗列了下 juc 包下功能分类,这篇文章我们主要来介绍动态可监控线程池的,所以具体内容也就不展开讲了,以后有时间单独来聊吧。看这篇文章前,希望读者最好有一定的线程池 ThreadPoolExecutor 使用经验,不然看起来会有点懵。

如果你对 ThreadPoolExecutor 不是很熟悉,推荐阅读下面两篇文章

javadoop: https://www.javadoop.com/post/java-thread-pool

美团技术博客: https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html


背景

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

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

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

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

如果你有以上痛点,动态可监控线程池( DynamicTp )或许能帮助到你。

如果看过 ThreadPoolExecutor 的源码,大概可以知道其实它有提供一些 set 方法,可以在运行时动态去修改相应的值,这些方法有:

public void setCorePoolSize(int corePoolSize);
public void setMaximumPoolSize(int maximumPoolSize);
public void setKeepAliveTime(long time, TimeUnit unit);
public void setThreadFactory(ThreadFactory threadFactory);
public void setRejectedExecutionHandler(RejectedExecutionHandler handler);

现在大多数的互联网项目其实都会微服务化部署,有一套自己的服务治理体系,微服务组件中的分布式配置中心扮演的就是动态修改配置, 实时生效的角色。那么我们是否可以结合配置中心来做运行时线程池参数的动态调整呢?答案是肯定的,而且配置中心相对都是高可用的, 使用它也不用过于担心配置推送出现问题这类事儿,而且也能减少研发动态线程池组件的难度和工作量。

综上,可以总结出以下的背景


简介

我们基于配置中心对线程池 ThreadPoolExecutor 做一些扩展,实现对运行中线程池参数的动态修改,实时生效; 以及实时监控线程池的运行状态,触发设置的报警策略时报警,报警信息会推送办公平台(钉钉、企微等)。 报警维度包括(队列容量、线程池活性、拒绝触发、任务执行等待超时等);同时也会定时采集线程池指标数据供监控平台可视化使用。 使我们能时刻感知到线程池的负载,根据情况及时调整,避免出现问题影响线上业务。

特性


架构设计

主要分四大模块


使用

1.引入对应配置中心的依赖

2.配置中心配置线程池实例,配置参考下文(给出的是全配置项,配置项都有默认值)

3.启动类加 @EnableDynamicTp 注解

4.使用 @Resource 或 @Autowired 注解注入,或通过 DtpRegistry.getExecutor("name")获取

5.普通 JUC 线程池想要被监控,可以 @Bean 定义时加 @DynamicTp 注解

6.tips:动态线程池实例服务启动时会根据配置中心的配置动态注册到 Spring 容器中,建议不要用 @Bean 编程式重复声明同一线程池实例,直接配置在配置中心就行

7.详细参考下文及 Example 示例

  1. apollo 应用用接入用此依赖

        <dependency>
            <groupId>io.github.lyh200</groupId>
            <artifactId>dynamic-tp-spring-boot-starter-apollo</artifactId>
            <version>1.0.4</version>
        </dependency>
    
  2. spring-cloud 场景下的 nacos 应用接入用此依赖

        <dependency>
            <groupId>io.github.lyh200</groupId>
            <artifactId>dynamic-tp-spring-cloud-starter-nacos</artifactId>
            <version>1.0.4</version>
        </dependency>
    
  3. 非 spring-cloud 场景下的 nacos 应用接入用此依赖

        <dependency>
            <groupId>io.github.lyh200</groupId>
            <artifactId>dynamic-tp-spring-boot-starter-nacos</artifactId>
            <version>1.0.4</version>
        </dependency>
    
  4. zookeeper 配置中心应用接入

        <dependency>
            <groupId>io.github.lyh200</groupId>
            <artifactId>dynamic-tp-spring-boot-starter-zookeeper</artifactId>
            <version>1.0.4</version>
        </dependency>
    

    application.yml 需配置 zk 地址节点信息

        spring:
          application:
            name: dynamic-tp-zookeeper-demo
          dynamic:
            tp:
              config-type: properties         # zookeeper 只支持 properties 配置
              zookeeper:
                config-version: 1.0.0
                zk-connect-str: 127.0.0.1:2181
                root-node: /configserver/dev
                node: dynamic-tp-zookeeper-demo
    
  5. spring-cloud-starter-zookeeper-config 应用接入

        <dependency>
            <groupId>io.github.lyh200</groupId>
            <artifactId>dynamic-tp-spring-cloud-starter-zookeeper</artifactId>
            <version>1.0.4</version>
        </dependency>
    

    注:配置中心配置文件参考 example-zookeeper-cloud/resource 下的 config.txt ,该文件可以通过ZKUI工具导入到Zookeeper

  6. spring-cloud-starter-consul-config 应用接入

        <dependency>
            <groupId>io.github.lyh200</groupId>
            <artifactId>dynamic-tp-spring-cloud-starter-consul</artifactId>
            <version>1.0.4</version>
        </dependency>
    

    注:配置中心配置文件参考 example-consul-cloud/resource 下的 dynamic-tp-cloud-consul-demo-dtp.yml


注意事项


通知报警


监控

通过 collectType 属性配置监控指标采集类型,默认 logging


介绍文章

美团动态线程池实践思路,开源了

动态线程池框架( DynamicTp ),监控及源码解析篇

动态线程池( DynamicTp ),动态调整 Tomcat 、Jetty 、Undertow 线程池参数篇

美团动态线程池实践思路开源项目( DynamicTp ),线程池源码解析及通知告警篇


联系我

对项目有什么想法或者建议,可以加我微信拉交流群,或者创建 issues ,一起完善项目

公众号:CodeFox

微信:yanhom1314

4743 次点击
所在节点    Java
6 条回复
zhazi
2022-04-21 14:43:29 +08:00
如何否定一个程序员 《看他对 juc 包下的一些技术掌握的怎么样》
SuperManNoPain
2022-04-21 15:35:35 +08:00
😂挺好的
yanhomlin
2022-04-21 15:53:06 +08:00
欢迎兄弟们关注啊 可以加 v 交流
yanhomlin
2022-04-21 19:29:59 +08:00
@zhazi 好像也没毛病😂
yanhomlin
2022-04-21 19:30:23 +08:00
@SuperManNoPain 试用下看看
menget
2022-12-18 15:40:21 +08:00
支持一波,试用下看看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/848357

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX