愛在花開的季節 发表于 2024-10-9 03:41:22

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

本文属于进阶篇,并不是太得当新人阅读,但纯粹的学习还是可以的,由于后续会实现很多个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: 客户端发起毗连请求
{"msg": "connect", "version": "1", "support": ["1", "pre2", "pre1"]}

[*] connected: 服务器确认毗连成功
{"msg": "connected", "session": "RandomSessionId123"}

[*] ping/pong: 心跳消息
{"msg": "ping", "id": "unique-id-123"}
{"msg": "pong", "id": "unique-id-123"}

[*] sub/unsub: 订阅和取消订阅
{"msg": "sub", "id": "random-id", "name": "publicationName", "params": []}
{"msg": "unsub", "id": "random-id"}

[*] added/changed/removed: 数据更新通知
{"msg": "added", "collection": "collectionName", "id": "documentId", "fields": {}}
{"msg": "changed", "collection": "collectionName", "id": "documentId", "fields": {}}
{"msg": "removed", "collection": "collectionName", "id": "documentId"}

[*] ready: 初始数据加载完成通知
{"msg": "ready", "subs": ["subscription-id-1", "subscription-id-2"]}

[*] method/result: 方法调用和效果
{"msg": "method", "method": "methodName", "params": [], "id": "call-id"}
{"msg": "result", "id": "call-id", "result": {} }

DDP全生命周期时序图

可使用mermaid举行预览,时序图code如下
sequenceDiagram
    participant Client
    participant Server

    %% 握手和连接建立
    Client->>Server: connect {version: "1", support: ["1", "pre2", "pre1"]}
    Server-->>Client: connected {session: "RandomSessionId123"}

    %% 发布订阅
    Client->>Server: sub {id: "sub1", name: "posts", params: []}
    Server-->>Client: added {collection: "posts", id: "post1", fields: {...}}
    Server-->>Client: added {collection: "posts", id: "post2", fields: {...}}
    Server-->>Client: ready {subs: ["sub1"]}

    %% 实时更新
    loop Real-time updates
      Server-->>Client: changed {collection: "posts", id: "post1", fields: {...}}
      Server-->>Client: added {collection: "posts", id: "post3", fields: {...}}
      Server-->>Client: removed {collection: "posts", id: "post2"}
    end

    %% 方法调用
    Client->>Server: method {method: "addPost", params: [...], id: "m1"}
    Server-->>Client: added {collection: "posts", id: "post4", fields: {...}}
    Server-->>Client: result {id: "m1", result: {...}}

    %% 取消订阅
    Client->>Server: unsub {id: "sub1"}

    %% 心跳机制
    loop Keep-alive
      Client->>Server: ping {id: "ping1"}
      Server-->>Client: pong {id: "ping1"}
    end
时序图预览
https://i-blog.csdnimg.cn/direct/dfa4203e03da4af58a767a375bf41461.png
DDP在Meteor中的应用


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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 前端的全栈混淆之路Meteor篇:分布式数据协议DDP深度剖析