DDP vs Straight MongoDB访问用于同步大量数据

时间:2013-04-10 16:26:42

标签: meteor

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

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

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

谢谢! 麦克

2 个答案:

答案 0 :(得分:3)

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

  

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

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

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

如果你确实需要更实时的功能,DDP可能值得花费开销和初始设置难度。

答案 1 :(得分: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

此时确实没有同步系统,旧数据保持脱机状态(在localstorage或索引数据库或任何东西中),因此可以避免步骤3,并且只会发生该点的同步。

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