Mongodb 请求处理流程

Posted 数据分析与开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb 请求处理流程相关的知识,希望对你有一定的参考价值。


网址:http://www.mongoing.com/archives/1585


Mongodb多存储引擎支持机制介绍了Mongodb存储层创建数据库、创建集合、插入文档等数据库操作接口,本文将介绍mongodb处理客户端请求的模型。



Mongod在启动时会调用createServer创建一个PortMessageServer对象,其继承MessageServer和Listener两个类,并依赖MyMessageHandler来处理请求。


class PortMessageServer: public MessageServer, public Listener {
public:
    void accepted(boost::shared_ptr psocket, long long connectionId );
    void setupSockets();
    void run();
private:
   MessageHandler* _handler;
};


PortMessageServer




handleIncomingMsg


  1. 连接建立时,调用MyMessageHander::connected方法,初始化一个新的Client对象,Client对象包含DB操作的上下文。


  2. 不断调用recv从连接上读取请求,当读取到一个完整请求时,其将请求反序列化为一个Message对象,并调用MyMessageHandler::process方法处理请求,处理完后给客户端发送应答。


  3. 连接断开时,调用MyMessageHander::disconnected方法停止该连接对应的线程,释放Client对象。


MyMessageHandler::process


调用assembleResponse方法,从Message对象里获取请求类型(参考Mongdb协议),根据请求类型进行响应的处理。


  1. 如果为请求dbQuery,调用receivedQuery处理

  2. 如果为请求dbInsert,调用receivedInsert处理

  3. 如果为请求dbUpdate,调用receivedUpdate处理

  4. 如果为请求dbDelete,调用receivedDelete处理

  5. ……


上述各种请求最终会调用Database类的接口来处理。比如receivedInsert,会先根据Database回去对应的Collection对象,最后调用insertDocument往集合中插入文档。请求处理完后,给客户端发送应答消息。


问题分析


select的使用



thread per client模型


mongod为每个连接创建一个线程,创建时做了一定优化,将栈空间设置为1M,减少了线程的内存开销。当线程太多时,线程切换的开销也会变大,但因为mongdb后端是持久化的存储,切换开销相比IO的开销还是要小得多。




数据库开发

--------------------------------------

商务合作QQ:2302462408

投稿网址:top.jobbole.com


以上是关于Mongodb 请求处理流程的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB数据库

mongoDB 和 nodeJs 无法正确处理并发请求

暑假自学JAVA Web心得

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程