这可能无法完全回答您的问题,但是在花了无数小时调整大型流星应用程序的性能之后,我想我会分享一些我学到的东西。
在 Meteor 中,当您定义发布时,您正在设置一个响应式查询,当底层 mongo 数据的更改导致查询结果发生更改时,该查询会继续将数据推送到订阅的客户端。换句话说,它设置了一个查询,该查询将在插入、更新或删除数据时不断地将数据推送到客户端。它执行此操作的机制是observer
在查询上创建一个。
当 anobserver
被初始化时(例如订阅发布时),它将查询 mongodb 以获取要发送的初始数据集,然后使用 oplog 检测未来的更改。幸运的是,如果查询是针对相同的集合、相同的选择器和相同的选项,meteor 能够将现有的观察者重新用于新订阅。
这意味着您可以针对许多不同的发布创建数百个订阅,但如果它们针对同一个集合并使用相同的查询选择器,那么您实际上只有 1 个observe
在起作用。有关更多详细信息,我强烈建议从 kadira.io 阅读这篇文章(我从中获得了我在此答案中使用的信息)。
除此之外,Meteor 还能够处理多个出版物发布同一个文档,当这种情况发生时,文档将合并为一个。有关更多详细信息,请参阅此。
最后,由于 Meteor 的MergeBox组件,它将通过跟踪哪些数据已更改与客户端上已有的数据来最小化在所有订阅中通过网络发送的数据。
因此,在您的具体示例中,听起来您将在有效的同一查询(因为您只是试图对数据进行反规范化)和数据集上运行多个不同的订阅。由于我上面描述的所有优化,我猜你不会因为采用这种方法而受到性能问题的困扰。
我在我的一个应用程序中做过类似的事情,从来没有遇到过问题。