日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

 

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

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

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

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

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

 

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

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

DBClientConnection* c = new DBClientConnection();

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

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

c->close();

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

 

「轉」連接池居然這么簡單?

 

 

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

 

為什么需要連接池?

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

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

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

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

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

有了連接池之后,數(shù)據(jù)庫操作的偽代碼變?yōu)椋?/p>

DBClientConnection* c =

ConnectionPool::GetConnection();

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

ConnectionPool::FreeConnection(c);

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

連接池核心原理與實現(xiàn)是怎么樣的呢?

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

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

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

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

 

連接池核心數(shù)據(jù)結構是怎樣的呢?

連接池至少包含兩個核心數(shù)據(jù)結構:

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

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

 

連接池核心接口,是如何通過核心數(shù)據(jù)結構的操縱,實現(xià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;

}

}

}

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

 

「轉」連接池居然這么簡單?

 

 

會發(fā)現(xiàn),連接池管理核心并沒有想象的復雜。

 

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

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

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

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

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

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

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

 

思路比結論更重要,希望大家有收獲。

分享到:
標簽:連接池
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定