Mongodb 請求處理流程

2021-09-21 03:54:41 字數 1420 閱讀 6715

mongodb多儲存引擎支援機制介紹了mongodb儲存層建立資料庫、建立集合、插入文件等資料庫操作介面,本文將介紹mongodb處理客戶端請求的模型。

mongod在啟動時會呼叫createserver建立乙個portmessageserver物件,其繼承messageserver和listener兩個類,並依賴mymessagehandler來處理請求。

class portmessageserver: public messageserver, public listener ;
呼叫setupsockets為mongod配置的每個位址建立乙個socket,並呼叫bind繫結位址。

呼叫initandlisten監聽所有的位址,呼叫select等待監聽fd上發生連線事件,呼叫accept系統呼叫接受新的連線請求,並為每個新連線建立乙個執行緒,該執行緒執行handleincomingmsg方法,不斷處理該連線上的客戶端請求。

連線建立時,呼叫mymessagehander::connected方法,初始化乙個新的client物件,client物件包含db操作的上下文。

不斷呼叫recv從連線上讀取請求,當讀取到乙個完整請求時,其將請求反序列化為乙個message物件,並呼叫mymessagehandler::process方法處理請求,處理完後給客戶端傳送應答。

連線斷開時,呼叫mymessagehander::disconnected方法停止該連線對應的執行緒,釋放client物件。

呼叫assembleresponse方法,從message物件裡獲取請求型別(參考mongdb協議),根據請求型別進行響應的處理。

如果為請求dbquery,呼叫receivedquery處理

如果為請求dbinsert,呼叫receivedinsert處理

如果為請求dbupdate,呼叫receivedupdate處理

如果為請求dbdelete,呼叫receiveddelete處理

……上述各種請求最終會呼叫database類的介面來處理。比如receivedinsert,會先根據database回去對應的collection物件,最後呼叫insertdocument往集合中插入文件。請求處理完後,給客戶端傳送應答訊息。

select的使用

mongod呼叫select時,fdset裡只會加入監聽fd,而監聽的位址通常很少,故不存在效率問題。

thread per client模型

mongod為每個連線建立乙個執行緒,建立時做了一定優化,將棧空間設定為1m,減少了執行緒的記憶體開銷。當執行緒太多時,執行緒切換的開銷也會變大,但因為mongdb後端是持久化的儲存,切換開銷相比io的開銷還是要小得多。

MongoDB請求處理流程

mongodb多儲存引擎支援機制 介紹了mongodb儲存層建立資料庫 建立集合 插入文件等資料庫操作介面,本文將介紹mongodb處理客戶端請求的模型。mongod在啟動時會呼叫createserver建立乙個portmessageserver物件,其繼承messageserver和listene...

spring mvc請求處理流程

從web.xml中 servlet的配置開始,根據servlet攔截的url parttern,來進行請求 spring mvc工作流程圖 圖一 圖二 spring工作流程描述 1.使用者向伺服器傳送請求,請求被spring 前端控制servelt dispatcherservlet捕獲 3.dis...

SpringMVC處理請求流程

springmvc核心處理流程 3 handleradapter處理器介面卡,處理一些功能請求,返回乙個modelandview物件 包括模型資料 邏輯檢視名 4 viewresolver視 析器,先根據modelandview中設定的view解析具體檢視 5 然後再將model模型中的資料渲染到v...