一妈橄、如何通過連接訪問下游
工程架構中有很多訪問下游的需求讼载,下游包括但不限于服務/數(shù)據庫/緩存痕檬,其通訊步驟是為:
(1)與下游建立一個連接
(2)通過這個連接,收發(fā)請求
(3)交互結束毅该,關閉連接,釋放資源
這個連接是什么呢叹螟,通過連接怎么調用下游接口鹃骂?服務/數(shù)據庫/緩存,官方會提供不同語言的Driver罢绽、Document畏线、DemoCode來教使用方建立連接與調用接口,以MongoDB的C++官方Driver API為例(偽代碼):
DBClientConnection* c = new DBClientConnection();
c->connect(“127.0.0.1:8888”);
c->insert(“db.s”, BSON(”shenjian”));
c->close();
這個DBClientConnection就是一個與MongoDB的連接良价,官方Driver通過它提供了若干API寝殴,讓用戶可以對MongoDB進行連接,增刪查改明垢,關閉的操作蚣常,從而實現(xiàn)不同的業(yè)務邏輯。
二痊银、為什么需要連接池
當并發(fā)量很低的時候抵蚊,上述偽代碼沒有任何問題,但當服務單機QPS達到幾百、幾千的時候贞绳,建立連接connect和銷毀連接close就會成為瓶頸谷醉,此時該如何優(yōu)化?
結論也很簡單冈闭,服務啟動的時候俱尼,先建立好若干連接Array[DBClientConnection],當有請求過來的時候萎攒,從Array中取出一個遇八,執(zhí)行下游操作,執(zhí)行完再放回耍休,從而避免反復的建立和銷毀連接刃永,以提升性能。
而這個對Array[DBClientConnection]進行維護的數(shù)據結構羹应,就是連接池揽碘。有了連接池之后,數(shù)據庫操作的偽代碼變?yōu)椋?br>
DBClientConnection* c = ConnectionPool::GetConnection();
c->insert(“db.s”, BSON(”shenjian”));
ConnectionPool::FreeConnection(c);
三园匹、連接池核心接口與實現(xiàn)
通過上面的討論雳刺,可以看到連接池ConnectionPool主要有三個核心接口:
(1)Init:初始化好Array[DBClientConnection],這個接口只在服務啟動時調用一次
(2)GetConnection:請求每次需要訪問數(shù)據庫時裸违,不是connect一個連接掖桦,而是通過連接池的這個接口來拿
(3)FreeConnection:請求每次訪問完數(shù)據庫時,不是close一個連接供汛,而是把這個連接放回連接池
連接池核心數(shù)據結構:
(1)連接數(shù)組Array DBClientConnection [N]
(2)互斥鎖數(shù)組Array lock[N]
連接池核心接口實現(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)雀久,簡單的連接池管理并不是很復雜,基本原理即如上所述趁舀。
四赖捌、未盡事宜
上述偽代碼忽略了一些細節(jié),在實現(xiàn)連接池中是需要考慮的:
(1)如果連接全部被占用矮烹,是返回失敗越庇,還是讓上游等待
(2)需要實施連接可用性檢測
(3)為了讓調用方更友好,可能還需要包裝一層DAO層奉狈,讓“連接”這個東西對調用方都是黑盒的
(4)通過freeArray卤唉,connectionMap可以讓取連接和放回連接都達到O(1)時間復雜度
(5)可以通過hash實現(xiàn)id串行化
(6)負載均衡、故障轉移仁期、服務自動擴容都可以在這一層實現(xiàn)
希望這一分鐘大家有收獲桑驱。
==【完】==
大家可以點擊加入群:283943715java高級交流群**里面有Java高級大牛直播講解知識點 走的就是高端路線(如果你想跳槽換工作 但是技術又不夠 或者工作上遇到了瓶頸 我這里有一個JAVA的免費直播課程 講的是高端的知識點基礎不好的誤入喲 只要你有1-5年的開發(fā)經驗可以加群找我要課堂鏈接 注意:是免費的 沒有開發(fā)經驗誤入哦)