2012-09-06 92 views
14

我有6000股票的10M文件的集合,股票名称被编入索引。当我订购一种新股票时,流星挂起超过10秒钟以获得该股票的大约3000份文件。同样在几个股票订阅后,流星挂起100%CPU使用率。流星看起来非常慢,同步“大”的收集。其实我的应用程序只是只读。我想知道是否有办法为只读客户端加速流星?我也想知道是否为每只股票创建一个单独的集合有帮助?流星的订阅和同步缓慢

回答

7

虽然这是一个规模问题,可能还有待改进;应该注意的是,您正在使用错误的技术来完成您的任务,因为流星意味着客户端之间的交互,而不是用于检索大量的只读时间敏感数据。虽然状态跟踪屏幕可能还是有点意义的,但大量的时间关键数据肯定不会...

整个Meteor堆栈在任何本地堆栈中引入了一个简单实现的极度开销;说实话,我甚至会考虑Java或C#会在PHP和C++等低级语言之间进行选择时引入和思考的开销。像Ruby,Python,Node.js和其他语言真的是一个不同的故事;它们用于快速原型设计,但是由于它们需要花费的时间和吞吐量,所以它们需要对它们进行JIT处理,而不是在开销时忘记一些非本地方法来增加功能。

TL; DR使用这个职位的合适的工具,否则你会割伤手指...

+0

我个人希望能够用这种负载工作。在当时编辑+ - 10Mb的数据集应该不成问题。目前的问题似乎是,同步第一个4-5Mb的速度非常快,然后慢了很多。 – Thierry

+1

嗨,汤姆,我很欣赏你使用win.meteor.com所做的工作! 关于上面的问题,不能在流星中管理,如下所示? –

+0

@MaxHodges:我没有说你“不能”,我说这只是“错误的”。如果以正确的方式使用该技术,则可以获得相当的性能,但是无法达到低级别语言可为您提供的性能。如果你能承受数据的轻微延迟,为什么不;但是一旦你准备好了时间,生活和金钱等重要的东西,你真的需要重新考虑...... –

1

我爱流星的简单。我只是停止使用本地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: -> 
13

流星将整个数据集推送到您的客户端。

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

meteor remove autopublish

然后为你的客户创造特定的特定预订。

当您订阅您可以通过一个会话变量作为自变量,所以在客户端上你做这样的事情:

sub = new Meteor.autosubscribe(function(){ Meteor.subscribe('channelname', getSession('filterval')); }

您所使用的参数来筛选发送到结果集的服务器客户端,这样你就不会一下子把所有东西都管好了。您可以使用过滤器以某种方式分割数据。

Meteor.publish('channelname', function(filter){ return Collection.find({field: filter}); }

现在,只要你改变使用setSession('filterval', 'newvalue');订阅的客户端上的filterval会自动改变,新的数据集将发送到客户端。

您可以将其用作控制发送给客户端的数据量和数据量的一种手段。

正如另一张海报说,你真的不得不问这是否是这份工作的最佳工具。流星意味着相对较小的数据集,可以在两个方向进行实时更新。它经过大量优化,并为该用例提供大量脚手架。

对于另一个用例(例如只读大数据集),它可能没有意义。它有很多开销,提供了你不打算使用的功能,并且你将编码以获得你需要的功能。

1

启用autopublish后,您可能会看到Mongodb中大量文档的性能问题。您可以通过删除自动发布和编写代码来解决此问题,以仅发布相关数据而不是整个数据库。

该文档也进入手动管理缓存:

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

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

12

我一直在努力解决同样的问题。在我的情况下,我只需要同步约3000条记录,总共大约30KB。经过数周的尝试,我终于意识到同步不是问题,但似乎是同步时发生的LiveHTML更新。

通过在初始页面加载期间禁用模板更新,我可以将300(过滤)记录的页面加载时间从10秒减少到所有3000条记录的时间小于2秒。我做到了这一点,加入的条件所定义的模板内容的功能:

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

Template.itemlist.items = function() { 
    return Item.find({type: 'car'}, 
        {sort: {start: -1}, 
         limit: 30}); 
}; 

向(2S页面加载了3000条记录由服务器发布):

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); 
         } 
        }); 
}); 
+0

谢谢!我遇到了同样的问题。 – pcorey

+0

好的提示!谢谢。 –

+0

谢谢,它的工作原理。在+20s内有44000条记录,没有任何与之前相反的崩溃。它比没有好,但它仍然很长。 –