日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
連接池居然這么簡單?

?服務(wù)連接池,數(shù)據(jù)庫連接池,緩存連接池,連接池是微服務(wù)分層架構(gòu)中不可或缺的一個組件,本篇講講連接池的原理,以及實現(xiàn)細節(jié)。

10年積累的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有溫縣免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

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

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

  • 與下游建立一個連接;
  • 通過這個連接,收發(fā)請求;
  • 交互結(jié)束,關(guān)閉連接,釋放資源;

不管是服務(wù)/數(shù)據(jù)庫/緩存,官方會提供不同語言的Driver、Document、DemoCode來指導(dǎo)使用方建立連接與調(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ā)送請求、關(guān)閉連接,都非常清晰。

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

為什么需要連接池?

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

  • 當(dāng)服務(wù)啟動的時候,先建立好若干連接Array[DBClientConnection];
  • 當(dāng)請求到達的時候,再從Array中取出一個,執(zhí)行下游操作,執(zhí)行完放回;

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

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

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

DBClientConnection* c = 
ConnectionPool::GetConnection();
c->insert(“db.s”, BSON(”shenjian”));
ConnectionPool::FreeConnection(c);

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

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

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

  • Init:初始化Array[DBClientConnection],這個接口只在服務(wù)啟動時調(diào)用一次;
  • GetConnection:請求每次需要訪問數(shù)據(jù)庫時,不connect一個新連接,而是通過連接池的這個接口來拿連接;
  • FreeConnection:請求每次訪問完數(shù)據(jù)庫時,不是close一個連接,而是把這個連接放回連接池;

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

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

  • 連接數(shù)組Array DBClientConnection[N];
  • 互斥鎖數(shù)組Array lock[N];

連接池核心接口,是如何通過核心數(shù)據(jù)結(jié)構(gòu)的操縱,實現(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),連接池管理核心并沒有想象的復(fù)雜。

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

  • 需要實施連接可用性檢測,如果有連接失效,需要重建連接;
  • 通過freeArray,connectionMap等數(shù)據(jù)結(jié)構(gòu),可以讓取出連接和放回連接都達到O(1)時間復(fù)雜度;
  • 可以通過hash取連接,實現(xiàn)id串行化;
  • 每條連接被取到的概率必須相同,以實現(xiàn)負載均衡;
  • 如果有下游故障,失效連接必須剔除,以實現(xiàn)故障自動轉(zhuǎn)移;
  • 如果有下游新增,需要動態(tài)擴充連接池,以實現(xiàn)服務(wù)自動發(fā)現(xiàn);

思路比結(jié)論更重要,希望大家有收獲。?


網(wǎng)頁標(biāo)題:連接池居然這么簡單?
地址分享:http://m.5511xx.com/article/djcsjpd.html