2

我们正在 Meteor 中构建一个将参与教育生态系统的应用程序。有许多应用程序(例如,GradeBook、学生信息系统、报告系统……)都需要使其数据存储与 Meteor 保持同步。数据存储大小将在数十万个文档中。

我的理解是,DDP 用于将“客户端”连接到 Meteor 应用程序(通过在 Meteor 推送数据更改和 RPC 以将数据获取到 Meteor 时订阅提要)。并且“客户端”通常仅限于用户......因此与数据世界相比,数据集的大小相对较小(教师可能可以访问 250K 文档中的 100 个)。

如果我使用 DDP 将报告系统(作为“客户端”)连接到 Meteor,则需要同步存储中的所有数据......这是否意味着每次报告系统失去与 Meteor 的连接时,所有数据都将是从 Meteor 重新发送到 DDP 客户端?(因为报告系统对所有数据都感兴趣)......如果是这样的话,DDP 不会是保持应用程序同步的方式,对吧?......对于更小的范围数据集来说意味着更多...... ..我们可能应该直接与 Mongo 交互以保持同步。

谢谢!麦克风

4

2 回答 2

3

基于此 http://meteor.com/blog/2012/03/21/introducing-ddp

分布式数据协议。DDP 是解决客户端 JavaScript 开发人员面临的最大问题的标准方法:查询服务器端数据库,将结果发送到客户端,然后在数据库发生任何变化时将更改推送到客户端。

似乎很明显,任何新的 DDP 客户端都会接收所有数据,然后随着数据的变化而变化。

我建议如果您的“客户端”不需要反应性/实时更新/2 路同步,您应该直接从 mongo 中提取数据并避免“同步”的开销。对于“报告系统”,这应该是完全可以接受的,获取一堆数据,生成报告。您不应该关心在这种情况下更改数据,只关心快照和来自该快照的报告。

如果您确实需要更实时的功能,那么 DDP 可能值得开销和初始设置困难。

于 2013-04-10T17:02:51.670 回答
2

我认为 nate 的回答非常适合您应该做什么,特别是考虑到数据量。如果您需要显示大量数据,如果您使用页面来使用分页订阅,这样您就可以享受实时功能(如果您决定使用它)而无需一次全部下载。请记住,目前数据是这样发送的(对于每个会话,因此如果选项卡关闭并重新打开,它将被重做):

1 - Connect to DDP Server/Proxy (Long Polling now due to websocket issues with chrome)
2 - Establish a 'subscription'
3 - Fetch all data relevant to subscription (initial download)
4 - Subscription is complete, now the client will 'listen' for changes
5 - Any updates (remove/update/insert, etc) are sent down to the client

在这一点上确实没有一个同步系统,旧数据保持离线(在本地存储或索引数据库或任何东西中),因此可以避免第 3 步,并且只会发生从该点开始的同步。

请注意,如果存在连接中断(例如,在短时间内失去连接性,Meteor 将失去与 DDP 线的连接,并且当它重新连接时,它会重新下载所有内容,就像从头开始一样。

于 2013-04-10T19:02:43.417 回答