MongoDB请求处理流程

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
简介: Mongodb多存储引擎支持机制介绍了Mongodb存储层创建数据库、创建集合、插入文档等数据库操作接口,本文将介绍mongodb处理客户端请求的模型。 Mongod在启动时会调用createServer创建一个PortMessageServer对象,其继承MessageServer和List

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

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
7月前
|
存储 NoSQL MongoDB
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
MongoDB针对初级,中级及熟练的技术开发人员推出系列技术文章与行业案例。深入浅出地剖析MongoDB产品基础原理,使用技巧,典型行业场景及应用,还有Code Demo及线上线下活动推荐!
4897 1
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
|
消息中间件 存储 NoSQL
Spring Boot中使用log4j实现http请求日志入mongodb
Spring Boot中使用log4j实现http请求日志入mongodb
288 0
MongoDB 3.2.9 请求 hang 分析及 wiredtiger 调优
MongoDB 3.2.9 版本在 wiredtiger 上做了很多改进,但不幸的时,这个版本引入了一个新的 bug,持续大量 insert/update 场景,有一定的可能导致 wiredtiger 进入 deadlock,MongoDB 官方迅速的在3.2.10里修复了该问题,该版本在 wir.
|
NoSQL MongoDB 算法
|
存储 NoSQL 数据库
|
存储 NoSQL MongoDB
mongodb查询处理流程
杨立明 2017-9-13 MyMessageHandler 用于处理客户端的发送的请求消息,如CRUD操作,db命令等. process函数是入口函数,函数主要执行做三件事 1 生成执行的上下文环境OperationContext 2 在1)的上下文环境上,处理这个请求消息 3 应答消息 生成.
2905 0
|
监控 NoSQL Windows
Windows安装MongoDB服务,提示错误1053:服务没有及时响应启动或控制请求问题答案
安装MongoDB服务,提示错误1053:服务没有及时响应启动或控制请求问题答案
29767 0
|
NoSQL Java 数据库
dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(四)Spring AOP中使用log4j实现http请求日志入mongodb
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/53978250 1、面向切面编程的一些术语 切面(Aspect):切面用于组织多个Advice,Advice放在切面中的定义。
861 0

相关产品

  • 云数据库 MongoDB 版