Mongodb源码分析--消息(message)
来源:互联网 发布:网络直播平台 编辑:程序博客网 时间:2024/06/06 09:40
客户端与服务端使用约定的消息(格式)进行通信,其消息头结构与C语言中的struct类似。具体的代码(位于message.cpp):
注:客户端可以使用除上面Reply之外的所有消息类型,因为Reply是数据库保留使用的。同时客户端可以使用QUERY和GETMORE消息来让服务端发送响应信息,其它消息类型则不会。
下面分别进行介绍。
Client 请求消息包括:
1.对于更新(document)消息,其消息结构如下:
flags 标志位向量:
bit 名称 描述
0 Upsert 如设置该位为0,同时未查询到相关document时,数据库会把提供的对象插入到集合中
1 MultiUpdate 如设置该位为1,则数据库会更新所有查询到的document,否则仅更新查询到的第一个
document
2-31 Reserved 必须设置为0.
2.对于插入(document)消息,其结构如下:
3. 对于查询(document)消息,其结构如下:
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)消息,其结构如下:
5. 对于删除(document)消息,其结构如下:
flags 标志位向量:
bit 名称 描述
0 SingleRemove 如设置,则仅删除查询到的第一个document,否则删除所有查询到的document
1-31 Reserved 必须设置为0
6.对于KILL_CURSORS 消息,该消息用于在数据库里关闭一个活动(active)的游标, 其结构如下:
注意:如果游标正在读时,如果未exhausted (直到 OP_QUERY 或 OP_GETMORE 返回 zero ), 则不必关闭游标
7.对于MSG(document)消息,它是向数据库发送诊断消息(diagnostic message). 而数据库到发送确定(fixed)顺应其结构如下:
数据库响应消息(针对QUERY或GET_MORE的顺应)包括:
对于REPLY 消息,其结构如下:
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++
- Mongodb源码分析--消息(message)
- Mongodb源码分析--消息(message)
- Mongodb源码分析--消息(message)
- Mongodb源码分析--消息(message)
- Android消息机制源码分析--Lopper,Handler,Message
- Android 消息机制 - Handler, Looper, Message, MessageQueue 的源码分析
- Looper、Message、MessageQueue、Handler异步消息处理机制源码分析
- RTMPdump源码分析: 发送消息(Message)(8)
- RTMPdump源码分析: 处理各种消息(Message)(10)
- Message(Message Pool)源码分析
- AndRoid源码分析----------Handler消息机制(1)Handler获取Message对象及Message的复用
- [Android源码]Message分析
- Android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- 启动ArcSDE服务报“Unable to start ArcSDE, Please check for zombie processes”的解决办法
- 链接中的href与onclick执行js的区别
- 模板 traits的一个经典例子 , 解决 void func(T t)根据t的类型不同来做不同的实现
- java float转byte不丢失精度方法
- stat函数
- Mongodb源码分析--消息(message)
- MAT(Memory Analyzer Tool)工具入门介绍
- WinXP与WinCE串口的运行机制之比较.
- C语言字符串 转载来和大家分享
- 理解数据库范式——通俗易懂 [转]
- 键盘上每个键作用!!! (史上最全的)
- MY 总结:编码字符集,彻底解决JAVA乱码
- jsp里调用属性出错,说没发现属性
- 使用CursorAdapter的注意啦