Meteor 流星';s的订阅和同步速度很慢

Meteor 流星';s的订阅和同步速度很慢,meteor,Meteor,我收集了1000万份6000支股票的文档,股票名称已编入索引。当我订阅一只新股票时,meteor会挂起超过10秒,以获得大约3000份该股票的文档。另外,在几只股票被认购后,meteor的cpu使用率达到100%。流星看起来真的很慢与同步“大”收集。实际上,我的应用程序只是只读的。我想知道是否有办法加快流星为只读客户端?我还想知道为每种股票创建一个单独的集合是否有帮助?虽然这是一个规模问题,可能可以改进;应该注意的是,您在任务中使用了错误的技术,因为Meteor是用于客户端之间的交互,而不是用于

我收集了1000万份6000支股票的文档,股票名称已编入索引。当我订阅一只新股票时,meteor会挂起超过10秒,以获得大约3000份该股票的文档。另外,在几只股票被认购后,meteor的cpu使用率达到100%。流星看起来真的很慢与同步“大”收集。实际上,我的应用程序只是只读的。我想知道是否有办法加快流星为只读客户端?我还想知道为每种股票创建一个单独的集合是否有帮助?

虽然这是一个规模问题,可能可以改进;应该注意的是,您在任务中使用了错误的技术,因为Meteor是用于客户端之间的交互,而不是用于检索大量只读时间敏感数据。虽然状态跟踪屏幕可能仍有一定意义,但大量的时间关键型数据肯定不会

整个Meteor堆栈比任何本机堆栈中的简单实现引入了极大的开销;老实说,我甚至会考虑在java和C++之间选择开销和开销,在选择PHP和C++的那种低级语言时会考虑和考虑。Ruby、Python、Node.js等语言实际上是另一回事;它们是为快速原型而设计的,但在延迟/吞吐量方面,由于JIT所需的开销,它们落后了,更不要忘记一些非本机方法所增加的开销


TL;DR:使用正确的工具来完成这项工作,否则你会割伤你的手指…

我喜欢meteor的简单。我只是停止使用本地mongodb集合以避免同步开销,性能看起来非常好

Meteor.default_connection.registerStore "prices", 
  beginUpdate: ->
  update: (msg) ->
    updateChart(msg.set)
  endUpdate: ->
  reset: ->
对于新的流星,下面的作品

  Meteor.default_connection.registerStore collection, 
    constructor: (@update) ->
    # Called at the beginning of a batch of updates.
    beginUpdate: ->
    update: (msg) ->
      update(msg.fields, msg.id) if msg.fields
    endUpdate: ->
    reset: ->

Meteor正在将整个数据集推送到您的客户机

您可以通过删除自动发布包来关闭自动发布:

流星移除自动发布

然后为您的客户端创建特定订阅

订阅时,可以将会话变量作为参数传递,因此在客户端上可以执行以下操作:

sub=newMeteor.autosubscribe(函数(){
Meteor.subscribe('channelname',getSession('filterval');
}

在服务器上,您可以使用参数筛选发送给客户端的结果集,这样您就不会一次将所有内容都管道化。您可以使用过滤器以某种方式对数据进行分段

Meteor.publish('channelname',函数(过滤器){ 返回集合.find({field:filter}); }

现在,每当您使用
setSession('filterval','newvalue');
更改客户端上的filterval时,订阅将自动更改,新数据集将发送到客户端

您可以将其用作控制发送到客户端的数据量和内容的方法

正如另一张海报所说,你真的必须问问这是否是这项工作的最佳工具。Meteor适用于在两个方向(可能)实时更新的相对较小的数据集。它经过了大量优化,并为该用例提供了大量支架


对于另一个用例(例如只读大型数据集)这可能没有意义。它有很多开销,提供了您不打算使用的功能,您将通过编码来获得所需的功能。

启用自动发布后,您可能会看到Mongodb中的大量文档集合会对性能造成影响。您可以通过删除自动发布并仅向发布中写入代码来解决这一问题删除相关数据,而不是整个数据库

这些文档还将手动进入管理缓存:

复杂的客户端可以打开和关闭订阅,以控制订阅的方式 许多数据保存在缓存中,并管理网络流量 订阅已关闭,其所有文档将从中删除 缓存,除非同一文档也由另一个活动文档提供 订阅


Meteor的其他性能改进目前正在进行中,包括一个DDP级别的代理以支持“大量客户端”。你可以在Meteor上看到更多细节。

我也遇到了同样的问题。在我的情况下,我只需要同步约3000条记录,总共约30KB。经过几周的尝试,我最终意识到同步不是问题,而是同步时发生的LiveHTML更新

通过在初始页面加载期间禁用模板更新,我能够将页面加载时间从300条(已过滤)记录的10秒减少到3000条记录的2秒以下。我通过向定义模板内容的函数添加一个条件来实现这一点:

之前(服务器发布300条记录的10秒页面加载):

到(服务器发布的3000条记录的2s页面加载):

要仅在加载数据后“激活”会话,我添加了:

Deps.autorun(function () {
    Meteor.subscribe("Item", 
                     {
                         onReady: function() {
                             Session.set("active", true);
                         }
                     });
});

我个人希望这能在这种负载下工作。在当时编辑+-10Mb的数据集应该不会有问题。当前的问题似乎是同步第一个4-5Mb的数据集非常快,然后速度会慢很多。嗨,汤姆,我很感谢你在win.meteor.com上所做的工作!关于上述问题,这不能在下面提到的流星?@MaxHodges:我不是说你“不能”,我只是说它“错了”;如果你以正确的方式使用技术,你可以获得相当高的性能,但你无法达到低级语言所能提供的性能。如果你能承受数据的轻微延迟,为什么不呢;但是一旦你达到了时间、生命和金钱的关键点,你真的需要重新考虑……好吧,我明白你的意思,但海报只是问你有任何方法可以加快速度,而不是真正要求实时性能。我有一个类似的问题,但规模较小。meteor只需几秒钟就可以从这个只有2K个文档的集合中返回结果。希望它能做一些聪明的事情,比如快速返回它需要的几条记录,然后
Template.itemlist.items = function () {
    if (Session.get("active")) {    
        return Item.find({type: 'car'},
                         {sort: {start: -1},
                          limit: 30});
    } else {
        return [];
    }
};
Deps.autorun(function () {
    Meteor.subscribe("Item", 
                     {
                         onReady: function() {
                             Session.set("active", true);
                         }
                     });
});