- 日期:20160119
- 地点:线上(Moxtra)
- 讲师:田思源 & 李明
- 静态文件
- DDP 消息
- HTTP 请求
- HTTP Server
- DDP Server
- 轮询 MongoDB
- 使用 MongoDB oplog
DDP 是 Distributed Data Protocol 的缩写。Meteor 根据 DDP 实现了客户端和服务器端。
是一个基于 JSON 的协议,DDP 可以在任何双向传输上实现。Meteor 的实现是基于 SockJS。
它主要来做两件事:
- 处理 RPC(Remote Procedure Calls)
使用 RPC,你可以调用服务端的方法,并得到返回结果。除此之外,DDP 还可以通知调用者 method 中的所有写操作被反映到所有其他连接的客户端。
例如:客户端调用一个服务器端函数 transferMoney
下面是 DDP 消息:
-
{"msg":"method", "method": "transferMoney", "params": ["1000USD", "arunoda", "sacha"], id": "randomId-1"}
-
{"msg": "result", id": "randomId-1": "result": "5000USD"}
-
{"msg": "updated", "methods": ["randomId-1"]}
解释:
- DDP 客户端(arunoda)调用 method transferMoney ,带有三个参数:1000USD, arunoda 和 sacha;
- 转账完成后,DDP服务端(bank)发送一条消息:arunoda的账户余额。余额在result field。如果出错了,会有一个error field;
- 然后,DDP 服务器端发送另一条叫做 updated 的消息,带着 method id,通知我:到 sacha 的转账已经成功。有时候,updated 消息会在 result 之前返回。
- 管理数据
这是 DDP 协议的核心部分。客户端可以利用这点来订阅一个实时的数据源,并得到通知。DDP 协议有三种通知:added,changed,removed。DDP 受到 MongoDB 的启发,每一个数据通知 (一个JSON 对象) 都被赋值到一个 collection。
例如:假设数据源叫做 account,用来保存所有交易。在本例中,sacha 连接到自己的 account,获取自己的交易记录。arunoda 转账之后,sacha 会收到一个新的交易。数据流如下:
DDP消息如下:
- {"msg": "sub", id: "random-id-2", "name": "account", "params": ["sacha"]}
- {"msg": "added", "collection": "transactions", "id": "record-1", "fields": {"amount": "50USD", "from": "tom"}} {"msg": "added", "collection": "transactions", "id": "record-2", "fields": {"amount": "150USD", "from": "chris"}}
- {"msg": "ready": "subs": ["random-id-2"]}
- {"msg": "added", "collection": "transactions", "id": "record-3", "fields": {"amount": "1000USD", "from": "arunoda"}}
解释:
- DDP 客户端(sacha)发送一个订阅请求到自己的账户;
- 发回已发生交易的通知;
- DDP 服务端发送完所有交易之后,会发送一个叫做ready的特殊消息。ready 消息指明订阅的所有初始数据都已经发送完成;
- 过了一会儿,arunnoda 转账之后,sacha会收到一条added 消息。
同样的,DDP 服务端也可以发送changed 和removed通知。例如:
//changed {"msg": "changed", collection": "transactions", "id": "doc_id", "fields": {"amount": "300USD"}}
//removed {"msg": "removed", "collection": "transactions", "id": "doc_id"}
理解和分析 DDP 非常重要,利于你理解Meteor的工作原理。要想看到真实的 DDP 消息,可以安装 DDP Analyzer。
-
结合 meteor 自带的几个例子,复习已讲过的概念,试试相关的命令。
meteor create —list meteor create —example [例子名] -
每个人在本 repo 里最少提一个issue。



