一次追踪Meteor和MongoDB数据同步问题的记录

Meteor的响应式数据

Meteor的最大亮点之一就是响应式数据,Meteor通过MiniMongo,DDP(Distributed Data Protocol),publish/subscribe,Merge Box,MongoDB模块(包括Oplog观察驱动等)等支撑响应式数据,使得一般情况下客户端注册了的数据集总是同步的。

Rocket.Chat

Rocket.Chat是基于Meteor平台开发的一款开源聊天应用,笔者出于工作需要对其进行二次开发。但是前几天一次对数据库数据的直接操作却出现了数据库不同步的现象,而在客户端上对数据库的幂等操作却有效地同步了。

在Rocket.Chat中负责维护权限的MongoDB文档是rocketchat_permissions,其中每个权限都有一个roles属性,用于存储一个拥有当前权限的角色的数组。

问题原因

问题尚未结局,怀疑应该是由于Meteor的Merge Box对JSON做缓存对比时只做根级属性的对比,不做深层对比造成的。

Meteor响应式数据的基本流程

MongoDB -> OpLog Engine -> MergeBox -> Publish/Subscribe -> DDP -> MiniMongo

参考

  1. Understanding MergeBox - MeteorHacks