美團的動態線程池,不依賴中間件可以實現么?
為什么寫這個項目?
大家好,我是龍臺。
美團線程池文章[1] 介紹中,因為業務對線程池參數沒有合理配置,觸發過幾起生產事故,進而引發了一系列思考。最終決定封裝線程池動態參數調整,擴展線程池監控以及消息報警等功能
在開源平臺找了挺多動態線程池項目,從功能性以及健壯性而言,個人感覺不滿足企業級應用
因為對動態線程池比較感興趣,加上想寫一個有意義的項目,所以決定自己來造一個輕量級的輪子
想給項目起一個簡單易記的名字,類似于 Eureka、Nacos、Redis;后來和朋友商量,決定以動物命名:Hippo(河馬)
GitHub:https://github.com/acmenlt/dynamic-threadpool(建議復制到電腦查看)
- ├── dynamic-threadpool
- │ ├── dynamic-threadpool-common -- 公共模塊
- │ ├── dynamic-threadpool-config -- 配置中心
- │ ├── dynamic-threadpool-console -- 控制臺
- │ ├── dynamic-threadpool-discovery -- 注冊中心
- │ ├── dynamic-threadpool-spring-boot-starter -- Client 依賴組件
- │ ├── dynamic-threadpool-example -- 示例項目
- │ └── dynamic-threadpool-server -- 服務端
- │ └── dynamic-threadpool-tools -- 抽象工具類
它解決了什么問題?
線程池在業務系統應該都有使用到,幫助業務流程提升效率以及管理線程,多數場景應用于大量的異步任務處理
雖然線程池提供了我們許多便利,但也并非盡善盡美,比如下面這些問題就無法很好解決
如果線程池的配置涉及到上述問題,那么就有可能需要發布業務系統來解決;如果發布后參數仍不合理,繼續發布......
Hippo 很好解決了這個問題,它將業務中所有線程池統一管理,遇到上述問題不需要發布系統就可以替換線程池參數
它有什么特性?
應用系統中線程池并不容易管理
參考美團的設計,Hippo 按照租戶、項目、線程池的維度劃分。再加上系統權限,讓不同的開發、管理人員負責自己系統的線程池操作
舉個例子,小編在一家公司的公共組件團隊,團隊中負責消息、短鏈接網關等項目。公共組件是租戶,消息或短鏈接就是項目
Hippo 除去動態修改線程池,還包含實時查看線程池運行時指標、負載報警、配置日志管理等。具體功能如下圖
如何運行 Demo?
目前動態線程池功能已經完成,可以直接把代碼拉到本地運行。項目中數據庫是作者 ECS Docker 搭建,大家直接使用即可
- 啟動 dynamic-threadpool-server 模塊下 ServerApplication 應用類
- 啟動 dynamic-threadpool-example 模塊下 ExampleApplication 應用類
通過接口修改線程池中的配置。HTTP POST 路徑:http://localhost:6691/v1/cs/configs,Body 請求體如下:
- {
- "ignore": "tenantId、itemId、tpId 代表唯一線程池,請不要修改",
- "tenantId": "common",
- "itemId": "message-center",
- "tpId": "message-produce",
- "coreSize": 10,
- "maxSize": 15,
- "queueType": 9,
- "capacity": 100,
- "keepAliveTime": 10,
- "rejectedType": 7,
- "isAlarm": 0,
- "capacityAlarm": 81,
- "livenessAlarm": 82
- }
接口調用成功后,觀察 dynamic-threadpool-example 控制臺日志輸出,日志輸出包括不限于此信息即為成功
- [🔥 MESSAGE-PRODUCE] Changed thread pool. coreSize :: [11=>10], maxSize :: [15=>15], queueType :: [9=>9]
- 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