视频汇总首页:http://edu.51cto.com/lecturer/index/user_id-4626073.html

======================================

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

  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的开销还是要小得多。

扫二维码关注微信订阅号,不定期分享干货

转载于:https://blog.51cto.com/xqtesting/1686265

Mongodb 请求处理流程相关推荐

  1. Asp.Net构架(Http请求处理流程) - Part.1

    2019独角兽企业重金招聘Python工程师标准>>> 引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何 ...

  2. 接收请求处理流程_从Tomcat入口了解Spring MVC的请求处理流程(2)问题答疑

    在上一篇 从Tomcat入口了解Spring MVC的请求处理流程 中主要介绍了spring mvc如何使用以及spring的DispatcherServlet加载细节以及URL映射配置,但是还是遗留 ...

  3. Http 请求处理流程(转)

    引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个特定 ...

  4. 转载--【笔记】Asp.Net构架(Http请求处理流程)

    转载--[笔记]Asp.Net构架(Http请求处理流程) 最近接触了一些Asp.Net开发人员,在聊到技术的时候,发现很多的Asp.Net开发人员都不明白在ASP.NET中一个页面请求的处理流程,今 ...

  5. ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程

    开篇:上一篇我们了解了在WebForm模式下一个Page页面的生命周期,它经历了初始化Init.加载Load以及呈现Render三个重要阶段,其中构造了页面控件树,并对页面控件树进行了大量的递归操作, ...

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

    从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...

  7. java处理请求的流程_Java Spring mvc请求处理流程详解

    Spring mvc请求处理流程详解 前言 spring mvc框架相信很多人都很熟悉了,关于这方面的资料也是一搜一大把.但是感觉讲的都不是很细致,让很多初学者都云里雾里的.本人也是这样,之前研究过, ...

  8. Struts2请求处理流程及源码分析

    Struts2请求处理流程及源码分析 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(Site ...

  9. 2021-05-12 MongoDB面试题 简单的描述下MongoDB选举流程

    简单的描述下MongoDB选举流程 1.副本集中的主节点选举必须满足"大多数"的原则,所谓"大多数"是指副本中一半以上的成员.副本集中成员只有在得到大多数成员投 ...

最新文章

  1. 设置nginx 防止上传恶意脚本
  2. [BZOJ1188/Luogu3185][HNOI2007]分裂游戏
  3. undefined和null
  4. h5策划书_一个好的H5营销活动设计要如何进行策划
  5. java设计模式演示样例
  6. qt中设置控件不能使用
  7. 计算机中如何取消家长控制用户,电脑怎么设置家长控制? 家长控制功能的使用技巧...
  8. svn管理ad元件库_AD元器件库服务器管理指南
  9. java调用数据库的基本步骤_java数据库操作基本流程和技巧
  10. katalon studio基础使用教程
  11. A Linux Kernel Miracle Tour - 启程
  12. P1463 [POI2001][HAOI2007]反素数 题解
  13. 爱签电子合同:湖北率先实现电子印章跨省互认
  14. android 引入sdk,导入 SDK
  15. VUE:使用element-ui的el-table时,自定义单元格内容,并tab快速切换指定编辑的单元格,而不是把所有能tab切换的都切换一遍
  16. Python编程基础(2)
  17. NCBI上查看SNP位点在哪个基因座上(locus)
  18. python 抓图_教程|Python抓图教程(下)
  19. [ISCC 2023] pwn部分
  20. 农业信息化技术导论划重点笔记-农业工程与信息技术

热门文章

  1. python绘制可多角度查看的3d图像
  2. 计算当前时间对应的本周一、上周一
  3. Java复习二 基本数据类型与变量和常量
  4. 利用正则来判断一个数字的范围
  5. 使用NFS启动Tiny4412开发板根文件系统
  6. 关于 客户端发现响应内容类型为“text/html; charset=utf-8”,但应为“text/xml”的解决方法...
  7. 两台路由器之间建立邻接关系的过程即报文信息交换过程
  8. UIView的飞入效果
  9. 【LeetCode】70.爬楼梯
  10. visual studio 工具箱(选项卡、无控件、灰图标)