通常如何通過連線訪問下游?
工程架構中有很多訪問下游的需求,下游包括但不限於服務/資料庫/快取,其通訊步驟是為:
(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() }
畫外音:把所有連線和互斥鎖初始化。
getconnection()
for i = 1 to n }
}畫外音:找乙個可用的連線,鎖住,並返回連線。
freeconnection(c)
for i = 1 to n }
}畫外音:找到連線,把鎖釋放。
會發現,連線池管理核心並沒有想象的複雜。
除了核心**,連線池還需要考慮哪些因素呢?
(1)需要實施連線可用性檢測,如果有連線失效,需要重建連線;
(2)通過freearray,connectionmap等資料結構,可以讓取出連線和放回連線都達到o(1)時間複雜度;
(3)可以通過hash取連線,實現id序列化;
(4)每條連線被取到的概率必須相同,以實現負載均衡;
(5)如果有下游故障,失效連線必須剔除,以實現故障自動轉移;
(6)如果有下游新增,需要動態擴充連線池,以實現服務自動發現;
Bundle 究竟是什麼?
bundle用於場景 在我印象中比較深刻的是,一般用於activity之間傳遞數值,也用於handler傳送訊息,如下 intent intent new intent bundle bundle new bundle bundle.putstring key value intent.putext...
分析EOF究竟是什麼
eof僅僅是一種狀態或者說條件,需要觸發。read呼叫遇到檔案結尾,觸發該條件,結果將返回0。針對eof,對於標準輸入裝置,普通檔案,管道檔案,網路套接字檔案是read如何觸發呢?下面程式將說明 server.c 是socket套接字服務端,目的為了網路套接字檔案是read如何觸發測試用的。serv...
分析EOF究竟是什麼
eof僅僅是一種狀態或者說條件,需要觸發。read呼叫遇到檔案結尾,觸發該條件,結果將返回0。針對eof,對於標準輸入裝置,普通檔案,管道檔案,網路套接字檔案是read如何觸發呢?下面程式將說明 server.c 是socket套接字服務端,目的為了網路套接字檔案是read如何觸發測試用的。serv...