MongoDB请求处理流程

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

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

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

PortMessageServer

  1. 调用setupSockets为mongod配置的每个地址创建一个socket,并调用bind绑定地址。
  2. 调用initAndListen监听所有的地址,调用select等待监听fd上发生连接事件,调用accept系统调用接受新的连接请求,并为每个新连接创建一个线程,该线程执行handleIncomingMsg方法,不断处理该连接上的客户端请求。

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的使用

mongod调用select时,fdset里只会加入监听fd,而监听的地址通常很少,故不存在效率问题。

thread per client模型

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

时间: 2024-10-30 04:03:05

MongoDB请求处理流程的相关文章

[转贴]Http 请求处理流程

这两天在编码过程过程中,突然对很多平常用了无数遍的东西喜欢刨根问底起来,例如这几天又在重新回顾Asp.Net的请求过程.HttpModule.HttpHander这些东西,不知道是不是老了,幸好网上已经有很多优秀的文章,例如下面要转贴的这篇,虽然前年就看过(当时是在蓝色理想上看的),现在看回过头看一遍,还有蛮有感觉的,还有几篇关于同属这一话题的文章也准备转贴在我的博客中,以做纪念 原文:http://www.tracefact.net/Asp-Net-Architecture/Http-Requ

ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚.如果想非常深刻地认识ASP.NET Core的请求处理管道,可以分两个步骤来进行,我们首先可以在忽略细节的前提下搞清楚管道处理HTTP请求的总体流程,然后再此基础上补充之前遗漏的细节.为了让读者朋友们能够更加容易地理解管道处理HTTP

一起谈.NET技术,ASP.NET 请求处理流程

HTTP处理流程图 以上流程的一些概念解释: 1.http.sys 是一个位于Win2003和WinXP SP2中的操作系统核心组件,能够让任何应用程序通过它提供的接口,以http协议进行信息通讯. 温馨提示:如果用户不慎删除了该驱动文件,不用担心,该驱动会在下次系统启动时重建.是一个删不掉的系统核心组件!实用程序结束该驱动,该驱动也会马上重新创建(只有粉碎文件才不能马上重建,但粉碎后,下次启动会重建). 微软在Windows 2003 Server里引进了新的HTTP API和kernel m

ASP.NET 请求处理流程

HTTP处理流程图 以上流程的一些概念解释: 1.http.sys 是一个位于Win2003和WinXP SP2中的操作系统核心组件,能够让任何应用程序通过它提供的接口,以http协议进行信息通讯. 温馨提示:如果用户不慎删除了该驱动文件,不用担心,该驱动会在下次系统启动时重建.是一个删不掉的系统核心组件!实用程序结束该驱动,该驱动也会马上重新创建(只有粉碎文件才不能马上重建,但粉碎后,下次启动会重建). 微软在Windows 2003 Server里引进了新的HTTP API和kernel m

ASP_NET_MVC3_请求处理流程(2) MVC源码分析

ASP_NET_MVC3_请求处理流程(1) MVC请求入口

#情人节#“会玩”的程序员:爱代码爱机车也爱...(单身汪自觉避让)

欢迎点击阅读MongoDB的技术文章和相关专题: 深度解读Facebook刚开源的beringei时序数据库 全球最热门的NoSQL系统--MongoDB技术实践与探索 当物流行业遇见MongoDB 专题<阿里云技术专家带你探寻MongoDB技术内幕>相关阅读: MongoDB复制集原理 MongoDB Sharded cluster架构原理 MongoDB请求处理流程 呆板,万年宅,交流障碍,没谈过恋爱--这是你对程序猿的认知么? 今天故事的主人公,是一名阿里云程序yuan.叶翔,男,身高一

学习ASP.NET Core,怎能不了解请求处理管道[1]: 中间件究竟是个什么东西?

ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 "通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程"(上篇.中篇.下篇) 中围绕着一个经过极度简化的模拟管道讲述了真实管道构建的方式以及处理HTTP请求的流程.在本系列 中,我们会还原构建模拟管道时可以舍弃和改写的部分,向读者朋友们呈现一个真是的HTTP请求处理管道. ASP.NET Core 的请求处理管道由一个服务器与一组有序排列的中间件构成

通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求

之所以称ASP.NET Core是一个Web开发平台,而不是一个单纯的开发框架,源于它具有一个极具扩展性的请求处理管道,我们可以通过对这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET Core应用的很多特性,比如路由.认证.会话.缓存等,都是通过对管道的定制来实现的.我们甚至可以通过管道定制在ASP.NET Core平台上创建我们自己的Web框架,实际上MVC和SingalR这两个重要的Web框架也是采用这样的方式创建的. [本文已经同步到<ASP.NET Core框架揭秘>