MongoDB原始碼閱讀之通訊協議 一

2021-10-05 22:58:10 字數 1717 閱讀 8898

mongodb wire protocol

mongodb通過一種特殊的client/server 之間的協議:wire protocol。它是一種基於socket的request/response之間的通訊協議。使用者通過mongo shell或者driver api, 進行建立、刪除、更新以及執行管理操作的命令, 都會產生乙個message, 用來表示該操作需要的資訊。 每乙個訊息, 都有一些公共的部分, 被稱作msgheader, 它分別記錄了訊息體的長度, 當前訊息的requestid, 目的端的database id, 以及代表操作的型別, 比如建立、刪除等。

struct msgheader
在**裡面, 通過message類, 來接受客戶端傳入的資訊,具體的**實現可以參考: src/mongo/util/net/message.h

在mongodb的main函式裡面, 會建立乙個mymessagehandler 物件, 由它來接收所有的來自於客戶端的訊息:

class mymessagehandler : public messagehandler 

if (!dbresponse.response.empty())

break;}}

};

訊息的處理

從上面的**可以看到, 所有的訊息處理函式為assembleresponse, 在其裡面會根據不同的訊息型別, 進行不同的處理:

void assembleresponse(operationcontext* txn,

message& m,

dbresponse& dbresponse,

const hostandport& remote) else

} else if (op == dbcommand) else if (op == dbgetmore) else else if (op != dbinsert && op != dbupdate && op != dbdelete) else else if (op == dbupdate) else if (op == dbdelete) else }}

// 記錄下curop的各種統計資訊, 包括locks等的各種資訊

locker::lockerinfo lockerinfo;

txn->lockstate()->getlockerinfo(&lockerinfo);

log() << debug.report(currentop, lockerinfo.stats);

...}

建立、刪除以及更新等操作, 這些操作可以很容易從上面的operation 型別進行區分, 然後我們根據相應的入口函式向下呼叫就能夠trace到其實現。

command和其他的相隨來講要複雜一點, 因為我們面臨了太多的command, 有database的, collection的, 副本集的, 以及sharding的,他們都來自於相同的基類:command, 其繼承結構如下:

每一種command的建構函式, 在其基類的command 部分會進行註冊: typedef stringmapcommandmap;

通過該乙個command命令, 經過map找到相關的具體的command物件, 每個command都有相關的許可權校驗, 以及命令執行函式run().

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...

原始碼閱讀 Glide原始碼閱讀之load方法(二)

原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...