W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
工程架構(gòu)中有很多訪問(wèn)下游的需求,下游包括但不限于服務(wù)/數(shù)據(jù)庫(kù)/緩存,其通訊步驟是為:
(1)與下游建立一個(gè)連接
(2)通過(guò)這個(gè)連接,收發(fā)請(qǐng)求
(3)交互結(jié)束,關(guān)閉連接,釋放資源
這個(gè)連接是什么呢,通過(guò)連接怎么調(diào)用下游接口?服務(wù)/數(shù)據(jù)庫(kù)/緩存,官方會(huì)提供不同語(yǔ)言的Driver、Document、DemoCode來(lái)教使用方建立連接與調(diào)用接口,以MongoDB的C++官方Driver API為例(偽代碼):
DBClientConnection* c = new DBClientConnection();
c->connect(“127.0.0.1:8888”);
c->insert(“db.s”, BSON(”shenjian”));
c->close();
當(dāng)并發(fā)量很低的時(shí)候,上述偽代碼沒有任何問(wèn)題,但當(dāng)服務(wù)單機(jī)QPS達(dá)到幾百、幾千的時(shí)候,建立連接connect和銷毀連接close就會(huì)成為瓶頸,此時(shí)該如何優(yōu)化?
DBClientConnection* c = ConnectionPool::GetConnection();
c->insert(“db.s”, BSON(”shenjian”));
ConnectionPool::FreeConnection(c);
通過(guò)上面的討論,可以看到連接池ConnectionPool主要有三個(gè)核心接口:
(1)Init:初始化好Array[DBClientConnection],這個(gè)接口只在服務(wù)啟動(dòng)時(shí)調(diào)用一次
(2)GetConnection:請(qǐng)求每次需要訪問(wèn)數(shù)據(jù)庫(kù)時(shí),不是connect一個(gè)連接,而是通過(guò)連接池的這個(gè)接口來(lái)拿
(3)FreeConnection:請(qǐng)求每次訪問(wèn)完數(shù)據(jù)庫(kù)時(shí),不是close一個(gè)連接,而是把這個(gè)連接放回連接池
連接池核心數(shù)據(jù)結(jié)構(gòu):
(1)連接數(shù)組Array DBClientConnection [N]
(2)互斥鎖數(shù)組Array lock[N]
Init(){
for i = 1 to N {
Array DBClientConnection [i] = new();
Array DBClientConnection [i]->connect();
Array lock[i] = 0;
}
}
說(shuō)明:把所有連接和互斥鎖初始化 GetConnection()
for i = 1 to N {
if(Array lock[i] == 0){
Array lock[i] = 1;
return Array DBClientConnection[i];
}
}
}
說(shuō)明:找一個(gè)可用的連接,鎖住,并返回連接FreeConnection(c)
for i = 1 to N {
if(Array DBClientConnection [i] == c){
Array lock[i] = 0;
}
}
}
說(shuō)明:找到連接,把鎖釋放上述偽代碼忽略了一些細(xì)節(jié),在實(shí)現(xiàn)連接池中是需要考慮的:
(1)如果連接全部被占用,是返回失敗,還是讓上游等待
(2)需要實(shí)施連接可用性檢測(cè)
(3)為了讓調(diào)用方更友好,可能還需要包裝一層DAO層,讓“連接”這個(gè)東西對(duì)調(diào)用方都是黑盒的
(4)通過(guò)freeArray,connectionMap可以讓取連接和放回連接都達(dá)到O(1)時(shí)間復(fù)雜度
(5)可以通過(guò)hash實(shí)現(xiàn)id串行化
(6)負(fù)載均衡、故障轉(zhuǎn)移、服務(wù)自動(dòng)擴(kuò)容都可以在這一層實(shí)現(xiàn)
希望這一分鐘大家有收獲。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: