前端的全栈之路Meteor篇(三):运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: MiniMongo 是 Meteor 框架中的客户端数据库组件,模拟了 MongoDB 的核心功能,允许前端开发者使用类似 MongoDB 的 API 进行数据操作。通过 Meteor 的数据同步机制,MiniMongo 与服务器端的 MongoDB 实现实时数据同步,确保数据一致性,支持发布/订阅模型和响应式数据源,适用于实时聊天、项目管理和协作工具等应用场景。

Meteor 是一个全栈 JavaScript 框架,致力于简化 Web 应用开发。MiniMongo 是 Meteor 框架中的一个独特组件,它将 MongoDB 数据库的功能带到了客户端,使客户端能够像操作数据库一样,进行查询、插入、更新和删除操作。这使得前端开发者能够无缝地处理数据,同时享受 Meteor 的数据同步机制。

前文提要:前端的全栈之路Meteor篇(一):开发环境的搭建 -全局安装或使用容器镜像 容器化开发环境下的meteor工程架构解析

MiniMongo 是什么?

MiniMongo 是 MongoDB 的客户端版本,它在浏览器中运行,并模拟了 MongoDB 的核心功能。它允许开发者在客户端直接使用类似 MongoDB 的 API 进行数据库操作,比如 find()insertAsync()updateAsync()removeAsync() 等(前端因为数据在内存可去掉Async后缀也可保持前后端异步一致性)。

MiniMongo 最强大的特性之一是它支持实时数据同步。通过 Meteor 的数据传输机制,客户端的 MiniMongo 与服务器端的 MongoDB 保持数据同步,保证数据的一致性。这使得应用可以即时响应用户操作,而无需手动刷新页面或重新请求数据。

MiniMongo 的核心功能

MiniMongo 提供了以下核心功能:

  1. MongoDB API 操作: 客户端可以使用标准的 MongoDB 操作方法,如查询、插入、更新和删除。
  2. 实时数据同步: 客户端的 MiniMongo 会与服务器端的 MongoDB 自动同步,使得数据在客户端和服务器之间保持一致。
  3. 发布/订阅机制: Meteor 的 publishsubscribe 机制与 MiniMongo 协同工作,实现数据的按需加载。
  4. 响应式数据源: 通过 Tracker 和 Blaze 等响应式库,客户端的界面可以根据 MiniMongo 数据的变化自动更新。

前后端数据同步的实现

Meteor 的数据同步是通过其特有的发布/订阅 (Pub/Sub) 模型和数据传输层 (DDP) 实现的。以下是 Meteor 在前后端数据同步中的实现原理和步骤:

1. 数据集合的定义

在 Meteor 中,数据集合的定义可以共享在前端和后端。客户端使用 MiniMongo,后端使用 MongoDB。无论是在服务器端还是客户端,我们都可以通过同样的方式定义一个集合。

// 定义共享的集合
import {
    Mongo } from 'meteor/mongo';

export const Tasks = new Mongo.Collection('tasks');

这个集合的定义会在客户端被实例化为 MiniMongo,在服务器端实例化为 MongoDB 集合。

2. 服务器端发布数据

服务器通过 Meteor.publish() 来向客户端发布数据。发布的数据源自服务器的 MongoDB 集合。默认发布到前端的同名集合,也就是Tasks是前后端公用的变量(实现会有点差距,但接口一致)。

// server/main.js
import {
    Tasks } from '../imports/api/tasks.js';

Meteor.publish('tasks', function publishTasks() {
   
  return Tasks.find();  // 返回任务集合中的数据
});

服务器端定义了一个名为 tasks 的发布函数,将 Tasks 集合中的数据传递给客户端。

3. 客户端订阅数据

客户端通过 Meteor.subscribe() 订阅服务器发布的数据。当客户端订阅成功后,服务器上的数据会通过 DDP 协议实时传输到客户端的 MiniMongo 数据库。

// client/main.js
import {
    Tasks } from '../imports/api/tasks.js';

Meteor.subscribe('tasks');

// 订阅完成后,客户端可以像操作 MongoDB 一样操作 MiniMongo
// 这个就有点类似vue的watchEffect, 它会在Tasks这个集合的数据变化时重新跑一下这个函数
Tracker.autorun(() => {
   
  const tasks = Tasks.find().fetch();
  console.log("Tasks from MiniMongo:", tasks);
});

在客户端,Meteor.subscribe('tasks') 订阅了服务器发布的任务数据,数据将存储在客户端的 MiniMongo 中,并且每次集合数据有变化时,都会自动更新。

4. 数据同步机制

Meteor 使用 DDP (Distributed Data Protocol) 协议来实现前后端的数据同步。DDP 是一种基于 WebSockets 的协议,用于在客户端和服务器之间传输数据。在客户端订阅数据时,DDP 会通过 WebSocket 通道持续地监听服务器端数据的变化,并将更新的数据推送给客户端。

客户端在 MiniMongo 中对数据的操作(如插入、删除、更新)同样通过 DDP 被传输到服务器。Meteor 的服务器会监听这些操作,更新 MongoDB 后再将结果反馈给客户端。整个过程是实时且双向同步的。

5. 插入和更新操作

由于 Meteor 的客户端和服务器端集合是同一个 API,当你在客户端执行插入、更新或删除操作时,这些变更会被自动同步到服务器端的 MongoDB 中。

服务端策略配置:

// 允许再server里面的代码,通过server.js引入
Tasks.allow({
   
   insert(user,doc){
   
     return !!user // 允许登录用户直接创建数据
   },
   remove(user,doc){
   
     return user===doc.userId // 允许删除属于自己的数据
   }
   // ..其它操作 update/upsert等
});

客户端插入数据:

// 前端client的代码
Tasks.insertAsync({
   
  text: "Learn MiniMongo",
  createdAt: new Date(),
});

当用户在客户端插入数据时,Meteor 会立即将这条数据添加到 MiniMongo 中,并通过 DDP 将操作传输到服务器,最终更新服务器端的 MongoDB 数据库。

客户端更新数据:

// 前端client的代码
Tasks.updateAsync(taskId, {
   
  $set: {
    completed: true },
});

客户端的更新操作同样会立即影响 MiniMongo,并通过 DDP 同步到服务器。

6. 数据冲突和一致性

Meteor 通过一种称为乐观 UI (Optimistic UI) 的机制来确保流畅的用户体验。客户端在提交数据变更时,先立即更新 MiniMongo 中的数据,再通过 DDP 同步到服务器。如果服务器的验证或其他操作失败,客户端会收到回滚通知,将数据恢复为正确状态。

示例:

  1. 客户端提交数据时,先直接更新 MiniMongo。
  2. 服务器接收数据后进行验证。
  3. 如果验证成功,服务器更新 MongoDB,并将最终结果反馈给客户端。
  4. 如果失败,客户端恢复为原始状态。

实际应用场景

MiniMongo 的这种前后端数据同步机制特别适用于以下应用场景:

  • 聊天应用: 消息可以实时从服务器同步到所有用户的浏览器。
  • 项目管理工具: 任务和进度的更新可以即时传播到所有在线用户。
  • 实时协作工具: 如共享文档、在线表格,用户的修改实时反映给其他用户。

总结

Meteor 的 MiniMongo 提供了一个强大的客户端数据库,让开发者可以轻松处理本地数据,同时通过 Meteor 的 DDP 实现了前后端数据的自动同步。通过这种机制,开发者能够快速构建出响应式、实时更新的 Web 应用,而不必手动编写复杂的同步逻辑。这一特性使得 Meteor 特别适合那些需要频繁更新数据、实时响应用户操作的应用场景。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
27天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
29天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
96 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
26天前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
2月前
|
人工智能 Cloud Native 容灾
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
|
2月前
|
监控 JavaScript 前端开发
前端的混合之路Meteor篇(六):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统
本文介绍了 Meteor 3.0 中的发布-订阅模型,详细讲解了如何在服务器端通过 `Meteor.publish` 发布数据,包括简单发布和自定义发布。客户端则通过 `Meteor.subscribe` 订阅数据,并使用 MiniMongo 实现实时数据同步。此外,还展示了如何在 Vue 3 中将 MiniMongo 的 `cursor` 转化为响应式数组,实现数据的自动更新。
|
2月前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
144 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
44 0
|
2月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。