自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深度剖析動(dòng)態(tài)線程池的九大場(chǎng)景

系統(tǒng)
hippo4j 通過對(duì) JDK ThreadPoolExecutor 線程池增強(qiáng),以及擴(kuò)展三方框架底層線程池等功能,為業(yè)務(wù)系統(tǒng)提高線上運(yùn)行保障能力。


線程池是一種基于 池化思想管理線程 的工具,使用線程池可以減少 創(chuàng)建銷毀線程的開銷,避免線程過多導(dǎo)致 系統(tǒng)資源耗盡。在 高并發(fā)以及大批量 的任務(wù)處理場(chǎng)景,線程池的使用是必不可少的。

如果有在項(xiàng)目中實(shí)際使用線程池,相信你可能會(huì)遇到以下痛點(diǎn):

  1. 線程池隨便定義,線程資源過多,造成服務(wù)器高負(fù)載。
  2. 線程池參數(shù)不易評(píng)估,隨著業(yè)務(wù)的并發(fā)提升,業(yè)務(wù)面臨出現(xiàn)故障的風(fēng)險(xiǎn)。
  3. 線程池任務(wù)執(zhí)行時(shí)間超過平均執(zhí)行周期,開發(fā)人員無法感知。
  4. 線程池任務(wù)堆積,觸發(fā)拒絕策略,影響既有業(yè)務(wù)正常運(yùn)行。
  5. 當(dāng)業(yè)務(wù)出現(xiàn)超時(shí)、熔斷等問題時(shí),因?yàn)闆]有監(jiān)控,無法確定是不是線程池引起。
  6. 原生線程池不支持運(yùn)行時(shí)變量的傳遞,比如 MDC 上下文遇到線程池就 GG。
  7. 當(dāng)項(xiàng)目關(guān)閉時(shí),無法做到優(yōu)雅退出,大量正在運(yùn)行的線程池任務(wù)被丟棄。
  8. 線程池運(yùn)行中,任務(wù)執(zhí)行停止,懷疑發(fā)生死鎖或執(zhí)行耗時(shí)操作,但是無從下手。

基于以上諸多痛點(diǎn),小馬哥著手 hippo4j 的開發(fā),致力于打造標(biāo)準(zhǔn)線程池 動(dòng)態(tài)變更 和 監(jiān)控 的中間件框架。

GitHub:?https://github.com/opengoofy/hippo4j?

Gitee:?https://gitee.com/agentart/hippo4j?

hippo4j 通過對(duì) JDK ThreadPoolExecutor 線程池增強(qiáng),以及擴(kuò)展三方框架底層線程池等功能,為業(yè)務(wù)系統(tǒng)提高線上運(yùn)行保障能力。

圖片

小貼士:hippo4j 不止于 Java ThreadPoolExecutor 的增強(qiáng),??Dubbo??、??RabbitMQ??、??RocketMQ??、??Hystrix??、??Tomcat??、??Jetty??、??Undertow?? 等框架線程池也都有進(jìn)行監(jiān)控和動(dòng)態(tài)變更。

1. 線程池隨意定義,造成服務(wù)器高負(fù)載

在系統(tǒng)開發(fā)的過程中,因?yàn)樯婕暗蕉嗳藚f(xié)作,難免會(huì)出現(xiàn)信息不互通的情況。在同一個(gè)系統(tǒng),對(duì)于線程池來說,常見的是線程池隨意定義。

  • 開發(fā)者張三要記錄用戶操作日志,定義了user-log-record-thread-pool;
  • 開發(fā)者李四要記錄會(huì)員操作日志,定義了member-log-record-thread-pool;
  • 開發(fā)者王五要記錄權(quán)限操作日志,定義了power-log-record-thread-pool
  • ……

隨著系統(tǒng)不斷開發(fā),相同或不同語義的線程池被定義得越來越多,間接導(dǎo)致服務(wù)器資源嚴(yán)重耗損。

而如果系統(tǒng)中使用 hippo4j,能夠在控制臺(tái)查看當(dāng)前應(yīng)用已有線程池,是否存在相同語義且業(yè)務(wù)可復(fù)用線程池實(shí)例,避免線程資源過度浪費(fèi)。

圖片

2. 線程池參數(shù)不易評(píng)估

業(yè)務(wù)中使用了線程池,十個(gè)程序員可能有九個(gè)都在犯嘀咕,這線程池的配置應(yīng)該如何選擇?

我覺得犯糾結(jié)的點(diǎn)主要有兩個(gè),無外乎設(shè)置的數(shù)多了或者少了。

  • 如果預(yù)設(shè)的線程數(shù)或阻塞隊(duì)列數(shù)量少了,當(dāng)業(yè)務(wù)量上來,會(huì)遇到兩種情況,不管哪一種對(duì)業(yè)務(wù)來說都是不能接受的。
  • 預(yù)估 200ms 執(zhí)行完的任務(wù),可能會(huì) 2s 執(zhí)行完,因?yàn)槿蝿?wù)都在排隊(duì)。
  • 任務(wù)滿了后,開始執(zhí)行拒絕策略,影響正常業(yè)務(wù)。
  • 如果超量設(shè)置線程池的參數(shù),無疑會(huì)造成資源浪費(fèi),同樣會(huì)造成兩種情況。
  • 線程資源也是占用服務(wù)器資源的,開啟的多了對(duì)服務(wù)器有一定壓力。
  • 如果過多得創(chuàng)建線程,當(dāng)和其它線程池一起執(zhí)行時(shí),服務(wù)器 CPU 上下文切換也是個(gè)問題。

大家都知道,如果要修改運(yùn)行中應(yīng)用線程池參數(shù),需要停止線上應(yīng)用,調(diào)整成功后再發(fā)布,而這個(gè)過程異常的繁瑣,如果能在運(yùn)行中動(dòng)態(tài)調(diào)整線程池的參數(shù)多好。

美團(tuán)技術(shù)團(tuán)隊(duì)基于這些痛點(diǎn),推出了動(dòng)態(tài)線程池的概念,催生了一批動(dòng)態(tài)線程池框架,hippo4j 也是其一。

圖片

如果應(yīng)用是集群部署,hippo4j 可以選擇修改線程池 某一實(shí)例,或者修改 集群全部實(shí)例,運(yùn)行時(shí)生效,不需要再重啟服務(wù)。

圖片

再比如,壓測(cè)時(shí)使用 hippo4j 動(dòng)態(tài)調(diào)整線程池參數(shù),對(duì)于開發(fā)測(cè)試來說,也是個(gè)不錯(cuò)的選擇。

圖片

3. 線程池運(yùn)行時(shí)報(bào)警策略

從線程池運(yùn)行時(shí)監(jiān)控的角度出發(fā),hippo4j 內(nèi)置 4 種報(bào)警策略,線程池活躍度、阻塞隊(duì)列容量、拒絕策略觸發(fā)以及任務(wù)運(yùn)行超時(shí)報(bào)警。

  • 線程池活躍度:假設(shè)閾值設(shè)置 80%,線程池最大線程數(shù) 10,當(dāng)線程數(shù)達(dá)到 8 發(fā)起報(bào)警。
  • 阻塞隊(duì)列容量:假設(shè)閾值設(shè)置 80%,阻塞隊(duì)列容量 100,當(dāng)容量達(dá)到 80 發(fā)起報(bào)警。
  • 觸發(fā)拒絕策略:當(dāng)線程池任務(wù)觸發(fā)了拒絕策略時(shí),發(fā)起拒絕策略報(bào)警。
  • 任務(wù)運(yùn)行超時(shí):假設(shè)單個(gè)任務(wù)超時(shí)為 1000ms,任務(wù)執(zhí)行超過該時(shí)間發(fā)起報(bào)警。

hippo4j 支持釘釘、企業(yè)微信和飛書軟件通知,線程池任務(wù)運(yùn)行超時(shí)報(bào)警示例:

圖片

4. 線程池運(yùn)行時(shí)狀態(tài)對(duì)開發(fā)者黑盒

線程池在服務(wù)運(yùn)行過程中,對(duì)開發(fā)者來說是一個(gè)完全的黑盒。開發(fā)者無法得知線程池的參數(shù)變化,比如阻塞隊(duì)列數(shù)量或者完成任務(wù)數(shù)等核心參數(shù),這對(duì)于排查問題來說并不友好。

hippo4j 支持線程池運(yùn)行時(shí)狀態(tài)實(shí)時(shí)查看,并在核心參數(shù)的基礎(chǔ)上擴(kuò)展了 負(fù)載、內(nèi)存以及拒絕次數(shù) 等關(guān)鍵指標(biāo),每次查詢返回線程池當(dāng)前運(yùn)行信息。

圖片

5. 線程池監(jiān)控

hippo4j 提供了兩種線程池運(yùn)行時(shí)數(shù)據(jù)監(jiān)控方式,分別是:

(1)內(nèi)置數(shù)據(jù)池?cái)?shù)據(jù)采集 + 監(jiān)控,無需依賴任何中間件,由 hippo4j 內(nèi)部集成的方式運(yùn)行。

圖片

(2)使用三方中間件 Prometheus + Grafana 或 ElasticSearch + Grafana 采集和監(jiān)控。

圖片

6. 整合 Spring ThreadPoolTaskExecutor

Spring ??ThreadPoolTaskExecutor?? 對(duì)原生線程池?cái)U(kuò)展了一部分功能,我認(rèn)為比較實(shí)用有兩個(gè),并且 hippo4j 也已經(jīng)支持。

  1. 當(dāng)服務(wù)停止時(shí),通知線程池處理剩余任務(wù),并在等待指定時(shí)間后強(qiáng)制停止。
  2. 傳遞線程上下文到線程池執(zhí)行上下文中。

第一個(gè)是實(shí)際使用中很核心的功能,減少了線程池丟棄任務(wù)的可能,這里重點(diǎn)說明下。

我們平時(shí)在停止應(yīng)用時(shí),有沒有這樣一個(gè)考慮,線程池中的任務(wù)真的都執(zhí)行完成了嗎?

可能執(zhí)行完了,可能沒有。

Spring 基于以上考慮,注冊(cè)了線程池銷毀方法。在應(yīng)用關(guān)閉時(shí),如果發(fā)現(xiàn)線程池存在任務(wù)沒有執(zhí)行完,需要等待一個(gè)指定時(shí)間。指定時(shí)間內(nèi)任務(wù)執(zhí)行如果執(zhí)行完畢,皆大歡喜;如果還存在沒有結(jié)束的任務(wù),則丟棄。

為什么會(huì)丟棄任務(wù)而不是再等等?

因?yàn)槿绻€程池任務(wù)長(zhǎng)時(shí)間執(zhí)行,會(huì)影響整個(gè)應(yīng)用的停止,進(jìn)行了折中處理。

7. 三方框架中間件線程池適配

hippo4j 的目標(biāo)是兼容所有框架的線程池,并可以提供監(jiān)控和動(dòng)態(tài)修改的能力。

目前已支持的三方框架線程池列表:

  • Apache Dubbo
  • Alibaba Dubbo
  • RabbitMQ
  • Apache RocketMQ
  • SpringCloud Stream RocketMQ
  • SpringCloud Hystrix
  • Tomcat
  • Jetty
  • Undertow

支持上述框架線程池的動(dòng)態(tài)變更參數(shù)和監(jiān)控功能,比如:

圖片

未來 hippo4j 會(huì)支持更多三方框架線程池,如果你有好的想法也可以和我溝通。

8. 線程池運(yùn)行堆棧查看

線程池運(yùn)行中,任務(wù)運(yùn)行停止,懷疑發(fā)生死鎖或執(zhí)行耗時(shí)操作。大多數(shù)程序員會(huì)選擇使用命令或者 arthas 查看線程池運(yùn)行中線程的堆棧,看看其中的 Worker 都在哪個(gè)方法卡住了。

hippo4j 基于以上痛點(diǎn),推出了線程池運(yùn)行堆棧實(shí)時(shí)查看功能。

圖片

9. 動(dòng)態(tài)線程池對(duì)性能有無影響

這可能是很多開發(fā)者擔(dān)心的一個(gè)點(diǎn),在這里統(tǒng)一回復(fù)下。

hippo4j 僅對(duì)線程池做部分核心功能增強(qiáng),沒有修改任務(wù)執(zhí)行源代碼流程,可以保證絕對(duì)的安全。

其次,hippo4j 上述的功能,都是與線程池執(zhí)行任務(wù)主流程外擴(kuò)展的,不會(huì)影響線程池正常的執(zhí)行性能。

hippo4j 為用戶提供了兩種運(yùn)行模式,分別是輕量級(jí)的配置中心接入,和功能更齊全的服務(wù)端接入,下面都來說說各自的優(yōu)缺點(diǎn)。

1. hippo4j config

依賴配置中心完成線程池的動(dòng)態(tài)變更,已支持的配置中心有:Nacos、Apollo、Zookeeper、Etcd,未來還會(huì)接入 Consul 等。

另外,hippo4j 已支持用戶自定義配置中心實(shí)現(xiàn),如果使用公司自研或其它配置中心,也可以極小工作量進(jìn)行引入。

使用 hippo4j config 模式的優(yōu)點(diǎn)和不足:

  • 優(yōu)點(diǎn):輕量級(jí)引入,可以根據(jù)項(xiàng)目中已有配置中心進(jìn)行 hippo4j 的集成,無需引入其它服務(wù),即可使用線程池參數(shù)動(dòng)態(tài)化、運(yùn)行時(shí)監(jiān)控、報(bào)警等核心功能。
  • 不足:缺少可視化控制臺(tái)頁面,上文中描述的諸多功能不能使用。

2. hippo4j server

需要部署 hippo4j Jar 包,涵蓋上文中描述的所有功能。

因?yàn)榉?wù)端內(nèi)部實(shí)現(xiàn)了配置中心和注冊(cè)中心(參考 nacos 和 eureka 實(shí)現(xiàn)),所以它不依賴任何三方中間件。

  • 優(yōu)點(diǎn):功能齊備,可以享受更多的服務(wù)和便利。如果應(yīng)用啟動(dòng)的是集群,可以指定其中某一個(gè)實(shí)例的線程池修改,而 config 則是整個(gè)集群變更。
  • 不足:相比較 hippo4j config,需要額外部署一個(gè) jar 包,增加了部署工作量。

如果最初使用 hippo4j config,想要切換到 server,兩者在進(jìn)行替換的時(shí)候,無需修改業(yè)務(wù)代碼。

使用建議:根據(jù)公司情況選擇,如果基本功能可以滿足使用,選擇 hippo4j config 使用即可;如果希望更多的功能,可以選擇 hippo4j server。

開源項(xiàng)目發(fā)展離不開用戶和貢獻(xiàn)者的支持,小馬哥梳理出最近 hippo4j 發(fā)展近況:

  • GitHub、Gitee 收獲3.3k+ star,830+ fork
  • 榮獲 Gitee 評(píng)選為GVP(最有價(jià)值開源項(xiàng)目)。
  • 70 名項(xiàng)目貢獻(xiàn)者 為 hippo4j 添磚加瓦,在這里重點(diǎn)感謝。
  • 18 家使用登記公司,生產(chǎn)環(huán)境正式運(yùn)行 hippo4j。
  • 通過墨菲安全掃描,無任何代碼安全漏洞隱患。

最后總結(jié)下,作者在每天下班和周六日的時(shí)間做開源項(xiàng)目,妥妥的為愛發(fā)電。如果各位大佬覺得有用,麻煩在以下平臺(tái) star 支持,非常感謝~

GitHub:?https://github.com/opengoofy/hippo4j?

Gitee:?https://gitee.com/agentart/hippo4j?

責(zé)任編輯:張燕妮 來源: 龍臺(tái)的技術(shù)筆記
相關(guān)推薦

2022-08-29 09:06:43

hippo4j動(dòng)態(tài)線程池

2022-09-06 08:31:09

線程池工具系統(tǒng)

2025-02-10 00:27:54

2016-08-24 16:23:36

服務(wù)架構(gòu)

2010-06-11 16:27:47

UML視圖

2020-04-28 22:14:07

自動(dòng)化威脅Bots

2021-01-21 14:07:24

區(qū)塊鏈行業(yè)發(fā)展物聯(lián)網(wǎng)

2025-01-20 09:00:00

架構(gòu)開發(fā)代碼

2023-12-11 21:45:52

Javaforeach循環(huán)結(jié)構(gòu)

2011-04-06 10:14:56

數(shù)據(jù)中心

2024-05-10 15:05:34

2013-08-21 10:06:48

服務(wù)器內(nèi)存交換性能

2015-06-26 09:25:42

2012-02-08 10:37:42

Java反射

2021-07-20 12:21:20

自動(dòng)化威脅瑞數(shù)信息

2023-04-19 13:18:41

動(dòng)態(tài)線程池平臺(tái)

2021-06-06 23:40:53

線程池使用場(chǎng)景

2025-01-09 11:24:59

線程池美團(tuán)動(dòng)態(tài)配置中心

2024-11-27 08:15:50

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)