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

news2024/10/12 0:44:03

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

什么是DDP?

DDP (Distributed Data Protocol) 是Meteor框架中使用的一种简单而强大的发布/订阅协议。它允许客户端和服务器之间进行实时数据同步,是Meteor实现实时应用的核心技术之一。

DDP的主要特点

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

DDP协议的详细过程

1. 握手和连接建立

  1. 客户端发送 connect 消息,可能包含版本信息和会话ID(如果是重连)。
  2. 服务器回复 connected 消息,包含新的会话ID。
  3. 如果是重连,服务器会恢复之前的订阅和方法调用状态。

2. 保活和心跳机制

  1. 客户端定期(通常每45秒)发送 ping 消息。
  2. 服务器回复 pong 消息。
  3. 如果超时未收到 pong,客户端可能会尝试重新连接。

3. 方法调用

  1. 客户端发送 method 消息,包含方法名和参数。
  2. 服务器执行方法,可能会触发数据变更。
  3. 服务器发送 result 消息,包含方法执行结果或错误信息。
  4. 如果方法导致数据变更,服务器会发送相应的 addedchangedremoved 消息。

4. 发布和订阅

  1. 客户端发送 sub 消息,包含订阅名称和参数。
  2. 服务器开始发送相关数据:
    • added 消息用于新增的文档
    • changed 消息用于更新的文档
    • removed 消息用于删除的文档
  3. 服务器发送 ready 消息,表示初始数据集已发送完毕。
  4. 之后,服务器会持续发送 addedchangedremoved 消息以保持数据同步。
  5. 客户端可以发送 unsub 消息来取消订阅。

DDP消息类型详解

  1. connect: 客户端发起连接请求

    {"msg": "connect", "version": "1", "support": ["1", "pre2", "pre1"]}
    
  2. connected: 服务器确认连接成功

    {"msg": "connected", "session": "RandomSessionId123"}
    
  3. ping/pong: 心跳消息

    {"msg": "ping", "id": "unique-id-123"}
    {"msg": "pong", "id": "unique-id-123"}
    
  4. sub/unsub: 订阅和取消订阅

    {"msg": "sub", "id": "random-id", "name": "publicationName", "params": []}
    {"msg": "unsub", "id": "random-id"}
    
  5. added/changed/removed: 数据更新通知

    {"msg": "added", "collection": "collectionName", "id": "documentId", "fields": {}}
    {"msg": "changed", "collection": "collectionName", "id": "documentId", "fields": {}}
    {"msg": "removed", "collection": "collectionName", "id": "documentId"}
    
  6. ready: 初始数据加载完成通知

    {"msg": "ready", "subs": ["subscription-id-1", "subscription-id-2"]}
    
  7. 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

时序图预览
ddp全生命周期时序图

DDP在Meteor中的应用

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java程序打包成jar包

步骤1 打开项目结构 步骤2 配置工件 选择你要打包的模块选择主类(程序的主入口main类)提取到目标会把库文件的jar包打包到目标,一般选择这个,更方便在不同电脑上运行 步骤3 构建并生成jar包 最后,在对应的out/artifacts文件夹中找到jar包,在终端输入java -jar xxxx.jar就可以正…

mac电脑如何删除应用程序?怎么删除苹果电脑里的软件

在使用Mac电脑的过程中,随着时间的推移,我们可能会安装大量的应用程序。然而,这些应用程序中有很多可能只是临时使用,或者已经不再需要了。这些无用的应用程序不仅占据了宝贵的硬盘空间,还可能拖慢Mac系统的运行速度。…

JAVA基础 day12

一、File、IO流 File是java.io.包下的类,file类的对象,用于代表当前操作系统的文件(可以代表文件、文件夹),使用File可以操作文件及文件夹。 注意:File只能对文件本身进行操作,不能读写文件里…

Vivado工程如何生成TCL文件以及如何利用TCL文件还原工程

Vivado工程如何生成TCL以及如何利用TCL还原工程 一、Vivado工程如何生成TCL文件一、利用TCL文件还原Vivado工程 为了方便Vivado工程的保存和传输,尤其是功能复杂的工程,其工程容量越大,因此,为了能够保留工程功能的同时&#xff0…

No.15 笔记 | CSRF 跨站请求伪造

目录 一、基础知识 (一)cookie 和 session、同源策略 (二)CSRF 原理 二、CSRF 类型 (一)GET 类型 (二)POST 类型 三、CSRF 实例讲解 (一)真实案例 &am…

消防应急物资仓库管理系统

集驰电子消防装备仓库管理系统(DW-S302系统)是一套成熟系统,依托3D技术、大数据、RFID技术、数据库技术、对装备器材进行统一管理,以RFID射频识别技术为核心,构建以物资综合管理为基础,智能分析定位为主要特色功能的装备器材库综合…

EtherNet IP网关HT3S-EIS-MDN读取七星华创CS310空气流量计数据应用案例

七星华创流量计CS310 (MODBUS RTU系列) 通过EtherNet/IP网关HT3S-EIS-MDN 与汇川H5U-A8的PLC进行交换数据应用案例 一、概述 本文主要介绍使用HI-TOP网关 HT3S-EIS-MDN在汇川H5U-A8 PLC和七星华创CS310流量计之间进行数据交换。 解决的问题:汇川H5U-A8如何通过…

机器学习篇-day05-ID3决策树 C4.5决策树 CART决策树-回归决策树 剪枝

一. 决策树简介 主要用于分类 概述 简介 概念 决策树是一种树形结构,树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果, 根节点尤为重要. 构建决策树步骤 特征选择:选取有较…

java医院后台管理系统设计与实现源码(springboot+vue+mysql)

项目简介 医院后台管理系统设计与实现实现了以下功能: 管理员:首页、个人中心、用户管理、零食分类管理、零食信息管理、订单评价管理、系统管理、订单管理。 用户:首页、个人中心、订单评价管理、我的收藏管理、订单管理。 前台首页&…

精选算法入门——day3

精选算法入门——day3 题目一题干解题思路一代码解题思路二代码解题思路三代码 题目二题干解题思路 题目三题干解题思路 题目四题干解题思路一代码解题思路二 题目五题干解题思路一代码解题思路二代码: 题目一 题干 大家都知道斐波那契数列,现在要求输…

尚雷仕(湖北)健康科技公司5.98MW分布式光伏10KV并网系统应用

1.概述 我国正致力于实现“双碳”目标,新能源装机容量正快速增长,电力系统正在经历向高比例新能源系统的转型。然而,分布式光伏的接入也带来了挑战,例如电能质量的下降和供电可靠性的不足。尽管如此,光伏发电依然具有…

Java的IO操作与文件的基本常识

首先什么是IO操作呢? IO操作其实解释操作硬盘 1. 文件系统操作 创建文件,删除文件,重命名文件,创建目录…操作 2. 文件内容操作 进行读与写操作 先来了解一下基本的文件知识方便学习接下来的IO操作 文件路径 文件路径是从数根节点触发,沿着树杈一直往下走,到达目标文件…

github——指标统计

github——指标统计 它的作用特定项目统计首页展示 github-readme-stats是一个可以统计指定用户github指标的项目。可以使用此项目统计自己的github,用于首页展示。效果如图: 它的作用 它可以: 统计git操作统计账户编程语言构成比例解除githu…

ThingsBoard规则链节点:Delete Keys节点详解

引言 删除键节点简介 用法 含义 应用场景 实际项目运用示例 智能家居系统 工业自动化生产线 车联网平台 结论 引言 ThingsBoard是一个功能丰富的物联网平台,它支持设备管理、数据收集与处理以及实时监控。其核心组件之一是规则引擎,允许用户定义…

杨中科 ASP.NETCORE 异步编程二

一、不要用sleep() 如果想在异步方法中暂停一段时间,不要用Thread.sleep(),因为它会阻塞调用线程,而要用await.Task.Delay()。 举例: 下载一个网址,3秒后下载另一个 示例: sleep() 为了能直观看到效果,使用winfor…

基于springboot vue 三味书屋网络书店销售管理设计与实现

博主介绍:专注于Java(springboot ssm springcloud) vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次…

【Windows】【DevOps】Windows Server 2022 在线/离线 安装openssh实现ssh远程登陆powershell、scp文件拷贝

服务器在线安装openssh 管理员权限启动powershell,输入指令 查看默认安装状态 Get-WindowsCapability -Online | Where-Object Name -like OpenSSH* 可以看到系统默认安装了客户端,未安装服务器端 安装服务器端 Add-WindowsCapability -Online -Nam…

Spring 循环依赖详解:问题分析与三级缓存解决方案

在Spring框架中,循环依赖(Circular Dependency)是指多个Bean相互依赖,形成一个循环引用。例如,Bean A依赖于Bean B,而Bean B又依赖于Bean A。这种情况在Bean创建时可能导致Spring容器无法正常完成初始化&am…

一点基础没有可以参加TRIZ创新方法培训吗?

当然可以,即使一点基础都没有,参加TRIZ创新方法培训也是完全可行的。TRIZ理论作为一种系统的创新方法,旨在帮助人们跨越思维定式,高效解决发明创造中的各种问题。本文,天行健六西格玛顾问将详细阐述为何零基础的学员也…

2024年诺贝尔物理学奖2

2024年,诺贝尔物理学奖没有颁给物理学家,而是给了两位计算机科学家,他们发明了神经网络,这项技术是人工智能的基础。这表明物理学和计算机科学的联系越来越紧密。获奖者约翰霍普菲尔德和杰弗里辛顿在神经网络方面做出了巨大的贡献…