執行緒池、連線池、物件池從0到1

小花貓Jane發表於2017-12-15

做網際網路研發,最早接觸使用
jdbc技術,為了資料庫連線能夠複用,會用到c3p0、dbcp等資料庫連線池。應該是研發人員最早接觸的資料庫連線池,再到httpclient http連線池,再到微服務netty連線池,redis客戶端連線池,以及jdk中執行緒池技術。這麼多資料庫、http、netty連線池,jdk執行緒池,本質上都是連線池技術,連線池技術核心是連線或者說建立的資源複用。

連線池技術核心:通過減少對於連線建立、關閉來提升效能。用於使用者後續使用,好處是後續使用不用在建立連線以及執行緒,因為這些都需要相關很多檔案、連線資源、作業系統核心資源支援來完成構建,會消耗大量資源,並且建立、關閉會消耗應用程式大量效能。網路連線本身會消耗大量核心資源,在
linux系統下,網路連線建立本身tcp/ip協議棧在核心裡面,連線建立關閉會消耗大量檔案控制程式碼(linux中萬物皆檔案,一種厲害抽象手段)系統資源。當下更多是應用tcp技術完成網路傳輸,反覆開啟關閉,需要作業系統維護大量tcp協議棧狀態。連線池本質上是構建一個容器,容器來儲存建立好的執行緒、http連線、資料庫連線、netty連線等。對於使用方相當於黑盒,按照介面進行使用就可以了。各個連線池構建、使用管理詳細過程大概分成以下三部分。

第一部分:首先初始化連線池,根據設定相應引數,連線池大小、核心執行緒數、核心連線數等引數,初始化建立資料庫、
http、netty連線以及jdk執行緒。

第二部分:連線池使用,前邊初始化好的連線池、執行緒池,直接從連線池、執行緒中取出資源即可進行使用,使用完後要記得交還連線池、執行緒池,通過池容器來對資源進行管理。

第三部分:對於連線池維護,連線池、執行緒池來維護連線、執行緒狀態,不可用連線、執行緒進行銷燬,正在使用連線、執行緒進行狀態標註,連線、執行緒不夠後並且少於設定最大連線、執行緒數,要進行新連線、執行緒建立。通過上邊可以瞭解到各種連線池技術以及執行緒池原理或者說套路,理解原理才能不被紛繁複雜表象掩蓋。

下面談談構建自己連線池,其實理解了連線池、執行緒原理,可以使用
ArrayList來構建自己連線池、執行緒池。初始化時建立配置連線數、執行緒,儲存在ArrayList容器中,使用時從ArrayList從取出連線、執行緒進行使用,執行完任務後,提交回ArrayList容器。前提條件是單執行緒,在多執行緒狀態下要用執行緒安全容器。前邊根據原理介紹了一個簡單連線池、執行緒池怎樣構建,實際工業級別執行緒池還要考慮到連線狀態,短連線重連,執行緒池維護管理高效,執行緒池穩定等多個因素。需要用到連線池而又沒有相關開源產品可用時,java連線池可以使用common-pool2來構建,比如google開源gRPC技術,本身是高效能跨平臺技術,但目前作為微服務使用,沒有連線池、負載均衡等相應配套,這時可以根據需要自己基於Java容器構建自己連線池。也可以利用common-pool2構建連線池來提升應用效能,以及保持高可用。common-pool2本身不僅僅可以構連線池使用,還可以用來構建物件池。

連線池還有一個副作用就是實現了高可用,在微服務場景下一個連線不可用,那麼再從
netty連線池中取出一個進行使用,避免了連線不可用問題。掌握原理從比較全面掌握各種池技術,避免資料庫連線池,再到httpclient http連線池,再到微服務netty連線池,redis客戶端連線池,以及jdk中執行緒池,物件池各種各樣池技術,使我們眼花繚亂,花費過多時間,掌握原理機制以不變應萬變。

想要學習前端開發的同學,可以加群:
543627393
學習哦!


相關文章