-? ? ?前言? ? ?-
今天我們通過【2w1h】方式來討論“連接池”:什么是深底搞懂連接池(what)?為什么需要連接池(why)?怎樣做一個連接池(how)?
-? ? ??什么是連接池???? ?-
深入思考連接池的本質(zhì),但不要思考的入淺過于復雜!
“池”是何實一種非常形象化的描述,它是連接一種容器,做儲存之用;在編程中我們往往使用數(shù)組、池文出徹鏈表、深底搞懂隊列、入淺map來表達。
“連接”是網(wǎng)絡中用于傳輸數(shù)據(jù)的通道;“連接”才是我們要真正去使用的對象,而“池”是用來管理“多個連接”的一種方式。
如果沒有用“池”來統(tǒng)一管理“連接”,“連接”將散布在程序各處;那為了使用方便,我們往往會在使用時建立連接,使用完畢后,就關閉連接。所以“連接池”給我們提供了使用“連接”的方便。
同時,池是做儲存之用的,所以“連接池”中的“連接”肯定是已經(jīng)建立好的長連接,比如tcp連接、websocket連接等,即取即用,用完放回。如果沒有真正理解“連接池”的本質(zhì),在面試中可能會出現(xiàn)“http連接池”的笑話!
根據(jù)下游類型,我們常見有數(shù)據(jù)庫連接池、緩存連接池、服務連接池,如下圖所示:
圖一 數(shù)據(jù)庫連接池
圖二 緩存連接池
?
圖三 服務連接池
在編程中,我們還經(jīng)常會碰到進程池、線程池、協(xié)程池、內(nèi)存池、對象池等。
-? ? ??為什么需要連接池???? ?-
除了連接池能非常方便的對連接進行管理外,一句話,在高吞吐時連接池大大提高了數(shù)據(jù)傳輸?shù)男省?/p>
從兩個方面說:
1、避免反復的三次握手和四次握手
長連接的建立需要進行三次握手,而連接的釋放需要進行四次握手,這是發(fā)生在系統(tǒng)層面的兩個動作,對于單條連接來說耗時微乎其微,但在高吞吐場景時,耗時則不能忽略。
所以連接池的即取即用和用完放回的特性,避免了大量三次握手和四次握手的無效耗時,節(jié)省了系統(tǒng)資源。
2、 增加并行車道,實現(xiàn)全雙工并行
數(shù)據(jù)通信包括單工、半雙工和全雙工。單工通信如下圖,數(shù)據(jù)只能從A到B,不符合訪問下游服務的場景。
圖四 單工通信
半雙工通信如下圖,數(shù)據(jù)可以從A到B,也可從B到A,但是同一時刻只能一個方向上進行數(shù)據(jù)傳輸,通道利用率是50%。
?
圖五 半雙工通信
全雙工通信如下圖,可同時存在從A到B和從B到A的數(shù)據(jù)傳輸,通道的利用率是100%。長連接就是全雙工通信。
?
圖六 全雙工通信
在IO密集型的互聯(lián)網(wǎng)應用中,一條全雙工通信通道仍然無法滿足數(shù)據(jù)吞吐的需求時,該如何解決?
在互聯(lián)網(wǎng)性能測試指標中有這樣一個公式:
QPS(吞吐量) =?并發(fā)數(shù) / 平均響應時間
在平均響應時間不變的情況下,適度增加并發(fā)數(shù)可以提升吞吐量;所以采用多條全雙工通信的方式可以在一定程度上(平均響應時間沒有大幅增加)提高吞吐量,而連接池則就最好的實現(xiàn)方式。
總結(jié)一下:為什么需要連接池?
(1)方便管理連接;
(2)避免反復三次握手和四次握手;
(3)更好地實現(xiàn)全雙工并行。
-? ? ??怎樣做一個連接池???? ?-
實現(xiàn)一個連接池,最關鍵的是均衡和保活,如下圖所示:
圖七 連接池實現(xiàn)原理
該連接池的“池”通過隊列數(shù)據(jù)結(jié)構(gòu)進行實現(xiàn),隊列先進先出的特性保證了使用連接的均衡性,每一條連接都可以均勻的被使用到。
連接池對外提供get()和free()兩個API,get()用于從隊首“出隊”獲取一條可用連接,free()用于將使用完的連接從對尾“入隊”釋放到隊列中。
業(yè)務代碼在低峰時會降低get()動作,所以連接池中的連接在長時間不用時會導致失效,此時保活線程在監(jiān)測到get()的使用頻率較低時,會模擬業(yè)務程序調(diào)用get()獲取連接后發(fā)送心跳包,然后再通過free()將被保活的連接放回隊列中,達到連接池中所有連接保活的目的。
?
在充分理解上述內(nèi)容后,可以了解高級連接池的擴展知識!
-? ? ? 高級連接池??? ?-
高級連接池通常應用在微服務系統(tǒng)中,如下圖:連接池連接下游多個節(jié)點。
圖八 高級連接池
高級連接池具備這樣幾個特性:
1、?高可用:下游任意一個server 宕機時,連接池會關閉相關無效連接,防止被client訪問;
2、?高可擴展:下游增加一個server節(jié)點時,連接池會發(fā)現(xiàn)并建立到新server節(jié)點的連接,供client訪問;
3、?負載均衡:連接池會根據(jù)下游server的服務能力的高低分配數(shù)據(jù)請求;
4、?中間件:當下游server是類MySQL數(shù)據(jù)庫并分片時,連接池會將請求打在相應的數(shù)據(jù)節(jié)點上,并對數(shù)據(jù)進行聚合。
堅持技術學習,必有所成!
特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關注的小伙伴,可以長按關注一下:
長按訂閱更多精彩▼
如有收獲,點個在看,誠摯感謝
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!