日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

KA,连接池居然这么简单?

發布時間:2025/3/21 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 KA,连接池居然这么简单? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《“ID串行化”保證群消息順序性》提到,可以通過連接池的改造,實現ID串行化,本篇講講連接池的原理,以及實現細節。

通常如何通過連接訪問下游?

工程架構中有很多訪問下游的需求,下游包括但不限于服務/數據庫/緩存,其通訊步驟是為:

(1)與下游建立一個連接;

(2)通過這個連接,收發請求;

(3)交互結束,關閉連接,釋放資源;

不管是服務/數據庫/緩存,官方會提供不同語言的Driver、Document、DemoCode來指導使用方建立連接與調用接口。

以MongoDB的C++官方DriverAPI為例:

DBClientConnection* c = new DBClientConnection();

c->connect(“127.0.0.1:8888”);

c->insert(“db.s”, BSON(”shenjian”));

c->close();

畫外音:建立連接、發送請求、關閉連接,都非常清晰。


這個DBClientConnection就是一個與MongoDB的連接,官方Driver通過它提供了若干API,讓用戶可以對MongoDB進行連接,增刪查改,關閉的操作,從而實現不同的業務邏輯。

為什么需要連接池?

當并發量很低的時候,連接可以臨時建立,但當服務吞吐量達到幾百、幾千的時候,建立連接connect和銷毀連接close就會成為瓶頸,此時該如何優化呢?

(1)當服務啟動的時候,先建立好若干連接Array[DBClientConnection];

(2)當請求到達的時候,再從Array中取出一個,執行下游操作,執行完放回;

從而避免反復的建立和銷毀連接,以提升性能。

而這個對Array[DBClientConnection]進行維護的數據結構,就是連接池。

有了連接池之后,數據庫操作的偽代碼變為:

DBClientConnection* c =??ConnectionPool::GetConnection();

c->insert(“db.s”, BSON(”shenjian”));

ConnectionPool::FreeConnection(c);

畫外音:取出連接、發送請求、放回連接,也非常清晰。

連接池核心原理與實現是怎么樣的呢?

可以看到連接池ConnectionPool主要有三個核心接口:

(1)Init:初始化Array[DBClientConnection],這個接口只在服務啟動時調用一次;

(2)GetConnection:請求每次需要訪問數據庫時,不connect一個新連接,而是通過連接池的這個接口來拿連接;

(3)FreeConnection:請求每次訪問完數據庫時,不是close一個連接,而是把這個連接放回連接池;

連接池核心數據結構是怎樣的呢?

連接池至少包含兩個核心數據結構:

(1)連接數組Array DBClientConnection[N];

(2)互斥鎖數組Array lock[N];

連接池核心接口,是如何通過核心數據結構的操縱,實現連接池功能的呢?

Init(){

?for i = 1 to N {

? Array DBClientConnection [i] = new();

? Array DBClientConnection [i]->connect();

? Array lock[i] = 0;

?}

}

畫外音:把所有連接和互斥鎖初始化。

GetConnection()

?for i = 1 to N {

? if(Array lock[i] == 0){

? ?Array lock[i] = 1;

? ?return Array DBClientConnection[i];

? ?}

?}

}

畫外音:找一個可用的連接,鎖住,并返回連接。

FreeConnection(c)

?for i = 1 to N {

?if(Array DBClientConnection [i] == c){

? ?Array lock[i] = 0;

? ?}

? }

}

畫外音:找到連接,把鎖釋放。


會發現,連接池管理核心并沒有想象的復雜。

?除了核心代碼,連接池還需要考慮哪些因素呢?

(1)需要實施連接可用性檢測,如果有連接失效,需要重建連接;

(2)通過freeArray,connectionMap等數據結構,可以讓取出連接放回連接都達到O(1)時間復雜度;

(3)可以通過hash取連接,實現id串行化;

(4)每條連接被取到的概率必須相同,以實現負載均衡;

(5)如果有下游故障,失效連接必須剔除,以實現故障自動轉移;

(6)如果有下游新增,需要動態擴充連接池,以實現服務自動發現;

總結

以上是生活随笔為你收集整理的KA,连接池居然这么简单?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。