Meteor的订阅和同步很慢

时间:2012-09-06 11:02:05

标签: meteor

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

5 个答案:

答案 0 :(得分:13)

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

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

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时,订阅将自动更改,新数据集将发送到客户端。

您可以使用此方法来控制向客户端发送的数据量和数据。

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

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

答案 1 :(得分:12)

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

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

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

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

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

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

答案 2 :(得分:8)

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

整个Meteor堆栈在任何本机堆栈中的简单实现上都会带来极大的开销。老实说,我甚至会考虑Java或C#引入的开销,并在选择PHP和C ++等低级语言时要三思而后行。像Ruby,Python,Node.js等语言真的是一个不同的故事;它们是为快速原型制作而制作的,但就延迟/吞吐量而言,它们由于JIT它们所花费的成本而落后,而不是忘记了一些非原生的做法添加的开销。

TL; DR 使用合适的工具完成工作,否则你会割断手指......

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

答案 4 :(得分:1)

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

文档也会手动管理缓存:

  

成熟的客户可以打开和关闭订阅来控制方式   大量数据保存在缓存中并管理网络流量。当一个   订阅已关闭,其所有文件都已从中删除   缓存,除非同一文档也由另一个活动提供   订阅。

目前正在对Meteor进行额外的性能改进,包括支持“非常多的客户”的DDP级代理。您可以在Meteor roadmap上查看更多详细信息。