Meteor中的重叠订阅是否会降低性能?

Meteor中的重叠订阅是否会降低性能?,meteor,meteor-publications,Meteor,Meteor Publications,这是我的问题 我有一个应用程序,用户可以在记事本中存储笔记 当前,当用户单击记事本时,我订阅了一份出版物,该出版物返回该记事本的前5个注释 因此,每当用户导航到一个新的记事本时,就会设置一个新的订阅,并且该记事本的5个注释将以minimongo结束。因此,minimongo一次在notes集合中只有5个notes 为了改善用户体验,我更改了出版物,因此在整个应用程序的初始加载时,我订阅了一份出版物,该出版物将返回所有记事本和每个记事本的前5个注释。所以现在在minimongo中,我们有(5倍的记

这是我的问题

我有一个应用程序,用户可以在记事本中存储笔记

当前,当用户单击记事本时,我订阅了一份出版物,该出版物返回该记事本的前5个注释

因此,每当用户导航到一个新的记事本时,就会设置一个新的订阅,并且该记事本的5个注释将以minimongo结束。因此,minimongo一次在notes集合中只有5个notes

为了改善用户体验,我更改了出版物,因此在整个应用程序的初始加载时,我订阅了一份出版物,该出版物将返回所有记事本和每个记事本的前5个注释。所以现在在minimongo中,我们有(5倍的记事本)数量的笔记

所以初始负载有点重,但我希望在那之后,在记事本之间导航会快得多

因此,在加载时,我订阅
myInfo
,它返回用户的记事本和每个记事本的前5个注释

然后,当您实际单击记事本时,我订阅了
myNotepadInfo
,它还返回记事本的前5个注释。由于初始订阅已检索到此信息,因此minimongo中的所有文档实际上都没有更改。但是我仍然想订阅
myNotepadInfo
,因为我有一个load more notes机制,它依赖于模板中的订阅

因此,我的应用程序完全可以应对这些变化,但我不确定到底发生了什么,以及这种方法是否真的有助于提高性能。我没有注意到在更改后记事本的加载方式有什么具体的区别

所以基本上我有第二个订阅,它与初始订阅重叠


在我看来,由于第二次订阅与第一次订阅重叠,它必须向客户机传输更少的文档,所以应该更快

这方面的两个关键问题是:(1)您向客户发送了多少数据?;以及(2)您预计有多少用户

第二点需要一些解释。Meteor当前(2016)发布子架构中的一个关键组件是在服务器上注册和跟踪客户端订阅。无法重复使用的每个附加订阅(即不复制另一个订阅)都会增加应用程序的CPU需求。在这里,听起来每个用户都“拥有”一个记事本(尽管可能不是这样)。如果是这样,这将意味着订阅重用率低——每个用户都需要一个独立的订阅来接收他/她的记事本,因为它们不能跨用户重用。因此,每个用户订阅两个记事本将使应用程序因订阅记事本而占用的CPU空间增加一倍

这不一定是坏事。如果你的应用程序是为管理、内部服务而设计的,或者只是为较少的用户而设计的,那么它可能不会产生明显的影响。对于一个希望/期待高用户数的面向消费者的应用程序来说,这将是一个糟糕的选择

Kadira关于观察者重用的一篇好文章,我还推荐他们(付费)的防弹流星文章


最后,您可以查看一些旨在改进这些问题的Kadira工具。您应该检查它们是否仍在积极维护中,尽管-我没有。

From:'但是,如果运行函数的下一次迭代订阅了相同的记录集(相同的名称和参数),Meteor很聪明,可以跳过一次浪费的退订/再订。我认为在创业时订阅所有内容不是一个好的做法。大量使用记事本会大大增加您的加载时间。这就是为什么订阅是免费的。如果您想实现动态加载/搜索,这是一个不错的选择。嗨,Jeremy,谢谢,这很有帮助。用户确实订阅了自己的信息。在出版物中,我通过在查询中使用
this.userId
返回记事本和注释。否则我怎么做?我不明白,这似乎是订阅您自己数据的唯一方式。无法将其设置为用户共享订阅。我遗漏了什么吗?我不认为你遗漏了什么。如果您在出版物中执行类似于
return notepad.find({userId:this.userId})
的操作,您将无法重用观察者,因此最好使用问题中概述的两种策略中的第一种。每个用户每个记事本订阅两次会更快地导致CPU问题,这是Meteor缩放的主要瓶颈。(唯一能稍微提高效率的方法是对this.userId进行空检查,这在上面链接的Kadira文章中引用过,但这并没有真正解决主要问题。)