Mongodb源码分析--消息(message)

EMQX消息存储MongoDB源码分析(3) -module(emqx_backend_mongo_cli). -behaviour(ecpool_worker). -include("../include/emqx.hrl"). -include("../include/mongo_protocol.hrl"). -export([client_connected/2, subscribe_lookup/2, client_disconnected/2, message_fetch/3, lookup_retain/2, a. 阅读详情

在Mongodb中,客户端和服务端进行通信是基于 mongodb wire protocol 。说白了,该协议是一个简单的基于socket,请求/响应方式的协议,客户端使用常规的TCP/IP套接字(socket)进行通信。

      客户端与服务端使用约定的消息(格式)进行通信,其消息头结构与C语言中的struct类似。具体的代码(位于message.cpp):
    
  
  1. struct MSGHEADER {  
  2.        int32 messageLength; // 消息长度(字节),包括它自身  
  3.        int32 requestID;     // 消息标识符,用于在请求响应过程中唯一标识该消息  
  4.        int32 responseTo;  // 源请求id(用于服务端发送应答信息时)requestID from the original request  
  5.        //   (used in reponses from db)  
  6.        int32 opCode; //消息类型,参见enum中描述  
  7.    };  
  8.    enum Operations {  
  9.        opReply = 1,     /* 对客户端请求的响应. */  
  10.        dbMsg = 1000,    /* 通常的消息命令(跟着字符串) */  
  11.        dbUpdate = 2001, /* 更新document消息 */  
  12.        dbInsert = 2002, /* 插入新document消息*/  
  13.        //dbGetByOID = 2003,/*保留*/  
  14.        dbQuery = 2004,  /* 查询一个集合*/  
  15.        dbGetMore = 2005, /* 从(一个)查询中获取更多数据,参见 Cursors */  
  16.        dbDelete = 2006, /* 删除一个或多个document*/  
  17.        dbKillCursors = 2007 /* 通知数据库,客户端已执行完毕,可以关闭该Cursors*/  
  18.    };  


        注:客户端可以使用除上面Reply之外的所有消息类型,因为Reply是数据库保留使用的。同时客户端可以使用QUERY和GETMORE消息来让服务端发送响应信息,其它消息类型则不会。 

      下面分别进行介绍。


Client 请求消息包括: 

    1.对于 更新 (document)消息,其消息结构如下:

  1. struct  OP_UPDATE {  
  2.     MsgHeader header;              //  前面介绍的标准消息类信息  
  3.     int32     ZERO;                //  0 - 为将来使用而保留的数据位  
  4.     cstring   fullCollectionName;  //  完整的集合名称,形如:"dbname.collectionname"  
  5.     int32     flags;               //  位向量,参见下面介绍  
  6.     document  selector;            //  查询选择器,用于指定查询条件  
  7.     document  update;              //  指定要执行的更新(document)  
  8. }  


       flags 标志位向量:

bit         名称              描述  
0        Upsert             如设置该位为0,同时未查询到相关document时,数据库会把提供的对象插入到集合中 
1        MultiUpdate      如设置该位为1,则数据库会更新所有查询到的document,否则仅更新查询到的第一个

                                document 
2-31    Reserved         必须设置为0.   



    2.对于插入 (document)消息,其结构如下:

  1. struct  {  
  2.     MsgHeader header;              //  前面介绍的标准消息类信息  
  3.     int32     ZERO;                //  0 - 为将来使用而保留的数据位  
  4.     cstring   fullCollectionName;  //  完整的集合名称,形如:"dbname.collectionname"  
  5.     document *  documents;      //  要插入的一个或多个document,如为多个时,这些document会依次逐个写到socket里  
  6. }  


    3. 对于查询 (document)消息,其结构如下:

  1. struct  
  2.   OP_QUERY {  
  3.     MsgHeader header;                 //  标准消息类信息  
  4.     int32     flags;                  //  位向量,参见下面介绍  
  5.     cstring   fullCollectionName;     //    
  6. 完整的集合名称,形如:"dbname.collectionname"  
  7.     int32     numberToSkip;           //    
  8. 设置从第一个document起,跳过(忽略)的document数  
  9.     int32     numberToReturn;         //  返回的document数  
  10.                                       //   in the first OP_REPLY batch  
  11.     document  query;                  //  查询对象,该对象同时包括一个或多个元素($query,   
  12. $orderby, $hint, $explain, $snapshot),这些元素用于匹配(match)包含在结果集(result   
  13. set)中的对象  
  14.   [ document  returnFieldSelector; ]  //  可选顶.   
  15. 要求返回的document应包含的字段(fields)                                   
  16. }  


     flags 标志位向量:

bit     名称                   描述 
0       保留                   必须设置为0   
1       TailableCursor     Tailable 表示在返回最后一条数据后,不要关闭当前 cursor。这是因为系统

                                考虑到稍后你可以再次使用该cursor.   
2       SlaveOk             是否允许查询replica slave结点. 通过返回错误信息,除非是在"local"名空间.   
3       OplogReplay       仅限内部replication时使用   
4       NoCursorTimeout   服务器为了防止内存使用过量,会在一段时间(10分钟)后将空闲的cursors

                                暂停(times out).   
5       AwaitData          与TailableCursor配合使用. 如果在数据尾部, 阻塞一会而不是返回无数据信息

                                 (no data). 当(阻塞)时间之后,通常执行返回(return)操作.   
6       Exhaust             个人理解:把数据作为一个包,整个下载下来。后面是英文原文说明:

                                  Stream the data down  full blast in multiple "more" packages,

                                  on the assumption that the client will fully read all data queried.

                                Faster when you are pulling a lot of data and know you want to pull it

                                all down. Note: the client is not allowed to not read all the data unless

                                it closes the   connection.   
7       Partial                 如一些shards宕掉,为了不抛出异常,则从 mongos 那里返回部分结果   
8-31    Reserved           必须设置为0   



      4. 对于查询更多 (document)消息,其结构如下:

  1. struct  {  
  2.     MsgHeader header;              //  标准消息类信息  
  3.     int32     ZERO;                //  0 - 为将来使用而保留的数据位  
  4.     cstring   fullCollectionName;  //  完整的集合名称,形如:"dbname.collectionname"  
  5.     int32     numberToReturn;      //  返回的document数  
  6.     int64     cursorID;            //  在REPLY消息中的Cursor标识符,其必须来自于数据库  
  7. }  



     5.  对于删除 (document)消息,其结构如下:

  1. struct  {  
  2.     MsgHeader header;              //  标准消息类信息  
  3.     int32     ZERO;                //  0 - 为将来使用而保留的数据位  
  4.     cstring   fullCollectionName;  //  完整的集合名称,形如:"dbname.collectionname"  
  5.     int32     flags;               //  位向量,参见下面介绍  
  6.     document  selector;            //  查询条件  
  7. }  


     flags 标志位向量:

bit     名称                      描述 
0       SingleRemove      如设置,则仅删除查询到的第一个document,否则删除所有查询到的document   
1-31   Reserved            必须设置为0   


      6.对于KILL_CURSORS 消息,该消息用于在数据库里关闭一个活动(active)的游标, 其结构如下:

  1. struct  {  
  2.     MsgHeader header;             //  标准消息类信息  
  3.     int32     ZERO;               //  0 - 为将来使用而保留的数据位  
  4.     int32     numberOfCursorIDs;  //  消息中游标数  
  5.     int64 *     cursorIDs;          //  cursorIDs的关闭顺序,其会依次写入到socket中  
  6. }  



      注意:如果游标正在读时,如果未exhausted (直到 OP_QUERY 或 OP_GETMORE 返回 zero ), 则不必关闭游标


      7.对于MSG (document)消息,它是向数据库发送诊断消息(diagnostic message). 而数据库到发送确定(fixed)顺应其结构如下:

  1. struct  {  
  2.     MsgHeader header;   //  标准消息类信息  
  3.     cstring   message;  //  message for the database  
  4. }  



   
数据库响应消息(针对QUERY或GET_MORE的顺应)包括:

      对于REPLY 消息,其结构如下:

 

  1. struct  {  
  2.     MsgHeader header;          //  标准消息类信息  
  3.     int32     responseFlags;   //  位向量,参见下面介绍  
  4.     int64     cursorID;        //  cursor id if client needs to do get more's  
  5.     int32     startingFrom;    //  应答(reply)的游标中的起始位置  
  6.     int32     numberReturned;  //  应答中的document数  
  7.     document *  documents;       //  应答的document(一或多个)  
  8. }  

 

      responseFlags 标志位向量:

bit     名称                       描述 
0       CursorNotFound      当执行getMore时,服务器上当前游标失效.返回 zero 结果信息.   
1       QueryFailure           查询失败时. 在返回信息(document)中包括一个 "$err" 字段对该

                                    失败加以描述.   
2       ShardConfigStale     Drivers should ignore this. Only mongos will ever see this set,

                                    in which case, it needs to update config from the server.   
3       AwaitCapable          在服务器支持AwaitData查询选项时进行设置. 如不设置,客户端会在

                                     一个Tailable 游标的两个getMore操作之间停止(sleep)一会.

                                     在Mongod 1.6版本中支持该选项并一直设置.   
4-31    Reserved              可忽略 



     上面是一些关于消息类型的介绍,下面让我们来看一下MongoDB的具体实现类。

     在mongodb中,其提供了如下几个类对消息进行定义,封装及解析, 接收/发送等操作(位于message.h和dbmessage.h):
  

其中:
    MsgData (struct类型):提供了对消息数据信息部分的结构定义,如操作标志位_operation,以及上面所说的flags.

    Message : 对MsgData封装以及对消息的操作方法(比如:设置消息数信息(MsgData),获取消息头信息,消息信息重置,消息设置追加等)

    MessagingPort :提供消息的发送,接收等。并将接收到的信息(如char *类型)进行分解,并调用消息(Message)的相关方法将分解结果作为参数传入,反之一样,这里它相当于一个转换器。

    DbMessage :特别的消息类型,它是对Message封装,用于提供针对数据库操作类型消息的访问

    QueryMessage : 对DbMessage中的查询请求消息进行解析封装

    好了,今天的内容就先到这里了。



    参考链接:http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol

    原文链接:http://www.cnblogs.com/daizhj/archive/2011/04/02/2003335.html 
    作者: daizhj, 代震军   
    微博: http://t.sina.com.cn/daizhj
    Tags: mongodb,message,protocol,c++

爬取百度图片 最开始,我们想要爬取图片,首先需要打开百度图库,然后在搜索栏中输入自己想要的图片(比如说壁纸)。接着右键检查,点击网络:起初可能没有名称信息,刷新界面就可以了。打开信息,查看标头内容可以看到请求URL为:复制这串URL,然后在浏览器中打开这个就是我们搜索的壁纸图片的网页内容。怎么找到图片的URL呢?在上述内容中,找到data,可以发现里面每隔一个aiEditData,下面代码的形式是一样的,就相当于一张图片。 阅读详情

相关推荐

使用广播星历进行 GPS 卫星位置的计算

目录1.计算卫星运动的平均角速度 n2.计算观测瞬间卫星的近地点角3.计算偏近点角4.计算真近点角 f5.计算升交角距 6.计算摄动改正项7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置9.计算观测瞬间升交点的经度 L10.计算卫星在瞬时地球坐标系中的位置11.计算卫星在协议地球坐标系中的位置使用广播星历进行GPS卫星位置的计算的详细步骤如下:关于在广播星历中各参数的分布情况可以参考下图:首先根据广播星历中给出的参数 计算参考时刻(TOE) 的平均角速度 式中,GM为万有引力常数 G 与地球总质量

qq_43381998的博客 5568

MongoDB数据库(附源码)

概述 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。 Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的...

weixin_43287508的博客 2651

AD9361 Fast Lock实战:Python脚本自动生成Profile寄存器配置(附完整代码)

本文详细介绍了利用Python脚本实现AD9361 Fast Lock Profile寄存器自动化配置的实战方案。通过解析频率合成公式、VCO约束及查表机制,脚本能根据目标频率一键生成完整的16进制寄存器序列,大幅提升射频系统开发中多频点切换的效率和准确性,并支持CSV、JSON、C头文件等多种输出格式,便于与FPGA/嵌入式系统集成。

weixin_29194693的博客 475

mongod源码分析session接受find命令-执行命令-返回数据给客户端-概要流程

mongo第一条命令状态转变流程是:State::Created 》 State::Source 》State::SourceWait 》 State::Process 》 State::SinkWait 》 State::Source 》State::SourceWait。session等待connection请求,状态转变流程:State::Created 》 State::Source 》State::SourceWait,最后调用_sinkMessage,将mongodb结果数据发送给客户端。

MongoDB4.0.7源代码研究,find、inser等命令调用过程,B+树数据存储逻辑,索引查询逻辑等深入知识。 1317

类银河恶魔城游戏开发学习笔记(0)

解决B站搬运【Unity教程】从0编程制作类银河恶魔城游戏P37中moveState和idleState循环切换的问题

Gellar的博客 1447

Android11.0系统中适配EC20模块4G及GPS功能

本文主要描述在RK3568Android11中适配EC20模块,启用4G与GPS功能。

yjz_0314的博客 2792

mongodb源码分析

github上下载代码到本地,首先找到程序入口main: 在mongod.cpp #if defined(_WIN32) // In Windows, wmain() is an alternate entry point for main(), and receives the same parameters // as main() but encoded in Windows Unicode (UTF-16); "wide" 16-bit wchar_t characters. The //

boyhailong的专栏 2498

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3325

Mongodb 源码分析:整体架构

工作中主要负责Mongodb数据库, 一直在学习Mongodb的源码, 很希望能够搞清楚Mongodb内部的具体实现。 从Mongodb中文社区和其他人的博客里面学到了很多, 因此, 开了这个博客希望把自己学到的一些分享给大家。 任何源码的分析都是从整体架构来开始的, Mongodb的整体架构跟其他的关系型的数据库很类似, 都是有一些关键的模块组成, 如: 存储引擎, 查询引擎等, 但是Mongod

baijiwei的博客 1万+

手把手拆解固态电池成本:2030年真能比液态电池便宜30%吗?

本文深度解析固态电池成本结构,探讨2030年实现比液态电池便宜30%的可行性路径。通过拆解正极材料、负极材料和固态电解质的成本演变,分析关键技术对降本的影响,并预测产业链协同效应下的成本优化趋势。文章指出,在材料创新、设备国产化和政策支持等多重因素推动下,固态电池有望在2030年实现显著降本目标。

kite3的博客 403

在 TASKPROCESSING 上为 ABAP OData 服务添加多个系统别名:从原理到落地的完整实践

本文面向SAP Gateway与ABAP开发者,详细讲解如何在TASKPROCESSING OData服务上添加系统别名。首先介绍了系统别名的概念与设计初衷,阐述了添加别名的业务场景需求,包括多系统接入、用户分流和灰度发布等。随后提供了标准配置步骤,从SPRO路径到具体操作说明,并分享了三个实际案例说明如何实现跨区域统一待办、按用户角色分流和灰度发布。最后给出了验证方法和常见问题解决方案,帮助开发者掌握这项基础但关键的配置技能,实现服务路由的可控管理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 137

MongoDB源码包安装流程记录

此处:需要特别注意:--bind_ip 0.0.0.0,这个启动参数的配置,因为后续需要使用程序来进行对mongodb的操作,如果这个地方未正确配置的话,可能会导致客户端无法正常连接与操作mongodb的数据库。此处,我下载的是:mongodb-linux-x86_64-4.0.28.tgz。利用工具将源码包上传到应用服务器或者虚拟机。从官网下载需要的版本安装包。系统:CentOS7。

AlickLbc的博客 892

基于STM32LXXX的模数转换芯片ADC(CMS24AD2001)驱动C程序设计

/ 电压 = (原始值 / 2^23) * Vref (注意:24位有符号数范围为 -2^23 到 2^23-1)//---------------- 硬件端口映射 (请根据实际电路修改) ----------------ADC_SCLK_HIGH();- PGA 放大倍数可选:1、2、4、8、16、32、64、128、256;//---------------- 宏定义操作 -------------------//---------------- 函数声明 -------------------

myron6688的博客 160

mongod源码分析session异步接受asyncSourceMessage()客户端流变Message对象

本文分析了MongoDB服务状态机中消息接收过程的关键实现。主要流程包括:1) ASIOSession从Created到Source等状态转换;2) 异步接收客户端消息的调用链,涉及_sourceMessage、asyncSourceMessage等方法;3) 消息格式解析,包含标准MsgHeader和特定数据;4) 两种线程模型(adaptive和synchronous)的处理差异;5) 底层opportunisticRead实现异步数据读取。重点剖析了动态线程模式下异步获取消息的完整流程,从网络层读取、

MongoDB4.0.7源代码研究,find、inser等命令调用过程,B+树数据存储逻辑,索引查询逻辑等深入知识。 1271

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

EMQX消息存储MongoDB源码分析(1)

EMQX消息存储MongoDB 牵涉的外部库文件列表 1、mongodb:https://github.com/comtihon/mongodb-erlang.git 2、ecpool:ecpoolis different with worker-pool libraries in that it is designed to pool connection/clients to server or databasehttps://github.com/emqx/ecpool.git -mod...

qq513036862的博客 454

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Mongodb源码分析--删除记录

在之前的一篇文章中,介绍了assembleResponse函数(位于instance.cpp第224行),它会根据op操作枚举类型来调用相应的crud操作,枚举类型定义如下:    enum Operations {        opReply = 1,     /* reply. responseTo is set. */ 

East271536394 890

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mongodb源码分析--查询

在之前的一篇文章中,介绍了mongodb的主程序入口main()的执行流程,其实main只是实始化一些参数信息并做了些后台线程任务的启动工作(包括数据准备和恢复),并最终启动一个线程进行循环侦听。今天将会介绍在mongodb中数据查询 (find)的流程,以了解mongodb是如果对message进行拆包分析,以及数据进行表扫描及索引使用的。

daizhj的专栏 3580

Mongodb源码分析--更新记录

在之前的一篇文章中,介绍了assembleResponse函数(位于instance.cpp第224行),它会根据op操作枚举类型来调用相应的crud操作,枚举类型定义如下: 可以看到dbUpdate = 2001 为更新操作枚举值,下面我们看一下assembleResponse在确定是更新操作时调用的方法,如下:

daizhj的专栏 4676

MongoDB源码分析向客户端asyncSinkMessage返回执行结果DbResponse

MongoDB请求处理流程分析:状态机从Created依次转变为Source、SourceWait、Process、SinkWait等状态。核心_processMessage方法负责处理客户端请求,主要逻辑包括:1) 解压缩消息;2) 通过handleRequest执行数据库操作获取DbResponse;3) 构建响应消息头;4) 处理getMore特殊逻辑;5) 通过_sinkMessage异步发送响应。网络层通过session_asio的asyncSinkMessage将响应写入Socket。

MongoDB4.0.7源代码研究,find、inser等命令调用过程,B+树数据存储逻辑,索引查询逻辑等深入知识。 883

EMQX消息存储MongoDB源码分析(4)

-module(emqx_backend_mongo). -include("../include/emqx_backend_mongo.hrl"). -include("../include/emqx.hrl"). -export([pool_name/1]). -export([register_metrics/0, load/0, unload/0]). -export([on_client_connected/3, on_subscribe_lookup/3, on_client.

qq513036862的博客 441
上一篇: Mongodb源码分析--插入记录及索引B树构建
下一篇: Mongodb源码分析--删除记录
jackfirst86
博客等级 码龄18年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值