美团的动态线程池,不依赖中间件可以实现么?

开发 项目管理
线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理,虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决.

[[430661]]

为什么写这个项目?

大家好,我是龙台。

美团线程池文章[1] 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能

在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用

因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子

想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis;后来和朋友商量,决定以动物命名:Hippo(河马)

GitHub:https://github.com/acmenlt/dynamic-threadpool(建议复制到电脑查看)

  1. ├── dynamic-threadpool 
  2. │   ├── dynamic-threadpool-common  -- 公共模块 
  3. │   ├── dynamic-threadpool-config  -- 配置中心 
  4. │   ├── dynamic-threadpool-console  -- 控制台 
  5. │   ├── dynamic-threadpool-discovery  -- 注册中心 
  6. │   ├── dynamic-threadpool-spring-boot-starter  -- Client 依赖组件 
  7. │   ├── dynamic-threadpool-example  -- 示例项目 
  8. │   └── dynamic-threadpool-server  -- 服务端 
  9. │   └── dynamic-threadpool-tools  -- 抽象工具类 

它解决了什么问题?

线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理

虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决

如果线程池的配置涉及到上述问题,那么就有可能需要发布业务系统来解决;如果发布后参数仍不合理,继续发布......

Hippo 很好解决了这个问题,它将业务中所有线程池统一管理,遇到上述问题不需要发布系统就可以替换线程池参数

它有什么特性?

应用系统中线程池并不容易管理

参考美团的设计,Hippo 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作

举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目

Hippo 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。具体功能如下图

如何运行 Demo?

目前动态线程池功能已经完成,可以直接把代码拉到本地运行。项目中数据库是作者 ECS Docker 搭建,大家直接使用即可

  1. 启动 dynamic-threadpool-server 模块下 ServerApplication 应用类
  2. 启动 dynamic-threadpool-example 模块下 ExampleApplication 应用类

通过接口修改线程池中的配置。HTTP POST 路径:http://localhost:6691/v1/cs/configs,Body 请求体如下:

  1.     "ignore""tenantId、itemId、tpId 代表唯一线程池,请不要修改"
  2.     "tenantId""common"
  3.     "itemId""message-center"
  4.     "tpId""message-produce"
  5.     "coreSize": 10, 
  6.     "maxSize": 15, 
  7.     "queueType": 9, 
  8.     "capacity": 100, 
  9.     "keepAliveTime": 10, 
  10.     "rejectedType": 7, 
  11.     "isAlarm": 0, 
  12.     "capacityAlarm": 81, 
  13.     "livenessAlarm": 82 

接口调用成功后,观察 dynamic-threadpool-example 控制台日志输出,日志输出包括不限于此信息即为成功

  1. [🔥 MESSAGE-PRODUCE] Changed thread pool. coreSize :: [11=>10], maxSize :: [15=>15], queueType :: [9=>9] 
  2. capacity :: [100=>100], keepAliveTime :: [10000=>10000], rejectedType :: [7=>7] 

现阶段已集成钉钉消息推送,后续会持续接入企业微信、邮箱、飞书、短信等通知渠道。可以通过添加钉钉群体验消息推送,群号:31764717

项目代码功能还在持续开发,初定发布 1.0.0 RELEASE 完成以下功能。部署了 Server 服务,只需要引入 Starter 组件到业务系统中,即可完成动态修改、监控、报警等特性

查看源码能收获什么?

目前还没有发布 Release 版本,小伙伴可以阅读框架源码,查看框架中好的设计理念或者编码技巧

在项目开发过程中,借鉴了 Nacos、Eureka、Seata、ShardingSphere 等中间件项目的优雅设计

总结回顾

小编是个有代码洁癖的程序员,项目中的代码开发完全遵守阿里巴巴代码规约,也推荐大家使用,培养好的编码习惯

参考资料

[1]美团线程池文章: https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html

 

责任编辑:姜华 来源: 龙台的技术笔记
相关推荐

2022-02-14 16:08:15

开源项目线程池动态可监控

2024-09-14 15:07:03

2019-08-12 11:00:59

美团网MySQL数据库

2015-12-21 14:56:12

Go语言Http网络协议

2014-06-20 09:18:54

Dustjs中间件

2016-11-11 21:00:46

中间件

2021-02-11 08:21:02

中间件开发CRUD

2011-05-24 15:10:48

2011-12-06 12:21:55

企业级移动应用

2015-10-15 10:32:48

WiFi物联网智能家居

2010-03-26 13:52:29

Python生成

2018-02-01 10:19:22

中间件服务器系统

2018-07-29 12:27:30

云中间件云计算API

2021-07-19 07:55:24

Redux中间件原理

2021-07-27 05:49:59

MySQL数据库中间件

2015-02-07 21:52:45

PaaS中间件

2018-05-02 16:23:24

中间件RPC容器

2013-03-13 10:37:22

中间件Windows

2010-03-24 17:59:20

2023-11-27 07:10:06

日志中间件
点赞
收藏

51CTO技术栈公众号