前端的全栈混淆之路Meteor篇:分布式数据协议DDP深度剖析 ...

打印 上一主题 下一主题

主题 671|帖子 671|积分 2013

本文属于进阶篇,并不是太得当新人阅读,但纯粹的学习还是可以的,由于后续会实现很多个ddp的版本用于web端、nodejs端、安卓端和ios端,提前预习和复习下。ddp协议是一个C/S架构的协议,但是客户端也同时可以是服务端。
  什么是DDP?

DDP (Distributed Data Protocol) 是Meteor框架中使用的一种简朴而强盛的发布/订阅协议。它答应客户端和服务器之间举行实时数据同步,是Meteor实现实时应用的焦点技术之一。
DDP的紧张特点


  • 传输层灵活性: DDP可以基于WebSocket,也可以通过HTTP长轮询等方式实现,比方使用SockJS在不支持WebSocket的环境中工作。
  • JSON格式: 全部的消息都使用JSON格式,便于剖析和调试。-必要留意的是,实际的传输是用的EJSON举行序列化和反序列,从而支持了更多的对象传输,详参考 前端的全栈混淆之路Meteor篇(四):支持自定义对象序列化的EJSON先容
  • 发布/订阅模型: 答应客户端订阅服务器端的数据集,并在数据变革时接收更新。它的应用例子见文章 前端的混淆全栈之路Meteor篇(三):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive体系
  • 方法调用: 客户端可以调用服务器端的方法,实现长途过程调用(RPC)。基于它的应用例子见文章 前端的全栈混淆之路Meteor篇(二):RPC方法注册及调用
  • 实时更新: 当订阅的数据发生变革时,服务器会主动将更新推送给客户端。这部分是和发布订阅关联的,本文会涉及到底层实现
  • 会话管理: 使用会话ID来维护客户端和服务器之间的毗连状态。
DDP协议的详细过程

1. 握手和毗连建立


  • 客户端发送 connect 消息,可能包含版本信息和会话ID(如果是重连)。
  • 服务器复兴 connected 消息,包含新的会话ID。
  • 如果是重连,服务器会规复之前的订阅和方法调用状态。
2. 保活和心跳机制


  • 客户端定期(通常每45秒)发送 ping 消息。
  • 服务器复兴 pong 消息。
  • 如果超时未收到 pong,客户端可能会实验重新毗连。
3. 方法调用


  • 客户端发送 method 消息,包含方法名和参数。
  • 服务器实行方法,可能会触发数据变更。
  • 服务器发送 result 消息,包含方法实行效果或错误信息。
  • 如果方法导致数据变更,服务器会发送相应的 added、changed 或 removed 消息。
4. 发布和订阅


  • 客户端发送 sub 消息,包含订阅名称和参数。
  • 服务器开始发送相关数据:

    • added 消息用于新增的文档
    • changed 消息用于更新的文档
    • removed 消息用于删除的文档

  • 服务器发送 ready 消息,表示初始数据集已发送完毕。
  • 之后,服务器会持续发送 added、changed 和 removed 消息以保持数据同步。
  • 客户端可以发送 unsub 消息来取消订阅。
DDP消息类型详解


  • connect: 客户端发起毗连请求
    1. {"msg": "connect", "version": "1", "support": ["1", "pre2", "pre1"]}
    复制代码
  • connected: 服务器确认毗连成功
    1. {"msg": "connected", "session": "RandomSessionId123"}
    复制代码
  • ping/pong: 心跳消息
    1. {"msg": "ping", "id": "unique-id-123"}
    2. {"msg": "pong", "id": "unique-id-123"}
    复制代码
  • sub/unsub: 订阅和取消订阅
    1. {"msg": "sub", "id": "random-id", "name": "publicationName", "params": []}
    2. {"msg": "unsub", "id": "random-id"}
    复制代码
  • added/changed/removed: 数据更新通知
    1. {"msg": "added", "collection": "collectionName", "id": "documentId", "fields": {}}
    2. {"msg": "changed", "collection": "collectionName", "id": "documentId", "fields": {}}
    3. {"msg": "removed", "collection": "collectionName", "id": "documentId"}
    复制代码
  • ready: 初始数据加载完成通知
    1. {"msg": "ready", "subs": ["subscription-id-1", "subscription-id-2"]}
    复制代码
  • method/result: 方法调用和效果
    1. {"msg": "method", "method": "methodName", "params": [], "id": "call-id"}
    2. {"msg": "result", "id": "call-id", "result": {} }
    复制代码
DDP全生命周期时序图

可使用mermaid举行预览,时序图code如下
  1. sequenceDiagram
  2.     participant Client
  3.     participant Server
  4.     %% 握手和连接建立
  5.     Client->>Server: connect {version: "1", support: ["1", "pre2", "pre1"]}
  6.     Server-->>Client: connected {session: "RandomSessionId123"}
  7.     %% 发布订阅
  8.     Client->>Server: sub {id: "sub1", name: "posts", params: []}
  9.     Server-->>Client: added {collection: "posts", id: "post1", fields: {...}}
  10.     Server-->>Client: added {collection: "posts", id: "post2", fields: {...}}
  11.     Server-->>Client: ready {subs: ["sub1"]}
  12.     %% 实时更新
  13.     loop Real-time updates
  14.         Server-->>Client: changed {collection: "posts", id: "post1", fields: {...}}
  15.         Server-->>Client: added {collection: "posts", id: "post3", fields: {...}}
  16.         Server-->>Client: removed {collection: "posts", id: "post2"}
  17.     end
  18.     %% 方法调用
  19.     Client->>Server: method {method: "addPost", params: [...], id: "m1"}
  20.     Server-->>Client: added {collection: "posts", id: "post4", fields: {...}}
  21.     Server-->>Client: result {id: "m1", result: {...}}
  22.     %% 取消订阅
  23.     Client->>Server: unsub {id: "sub1"}
  24.     %% 心跳机制
  25.     loop Keep-alive
  26.         Client->>Server: ping {id: "ping1"}
  27.         Server-->>Client: pong {id: "ping1"}
  28.     end
复制代码
时序图预览

DDP在Meteor中的应用


  • 实时数据同步: 当服务器端的数据发生变革时,客户端可以立即收到更新。
  • 用户界面响应: 通过DDP,用户界面可以实时反映数据的变革,提供流通的用户体验。
  • 分布式计算: 客户端可以调用服务器端的方法,实现复杂的计算或数据处置惩罚。
  • 多客户端协作: 多个客户端可以同时订阅相同的数据集,实现实时协作功能。
  • 离线支持: 通过本地缓存和重连机制,DDP可以支持离线操作和数据同步。
总结

DDP协议是Meteor框架的焦点组件之一,它为实时Web应用提供了强盛而灵活的数据同步机制。通过使用DDP,开发者可以轻松构建响应迅速、实时更新的当代Web应用,同时保持了在差别网络环境下的适应性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表