代码之家  ›  专栏  ›  技术社区  ›  poordeveloper

Meteor的订阅和同步很慢

  •  16
  • poordeveloper  · 技术社区  · 13 年前

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

    5 回复  |  直到 13 年前
        1
  •  14
  •   Josh Wulf    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'); 订阅将自动更改,新的数据集将发送到客户端。

    您可以使用它来控制向客户端发送多少数据以及发送什么数据。

    正如另一位发帖人所说,你真的要问这是否是这份工作的最佳工具。Meteor是指在两个方向上实时更新的相对较小的数据集。它经过了大量优化,并为该用例提供了大量的脚手架。

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

        2
  •  13
  •   Christian Fritz    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条记录的2页加载):

    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);
                             }
                         });
    });
    
        3
  •  10
  •   Dan Dascalescu    12 年前

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

    整个Meteor堆栈在任何本地堆栈中的简单实现上都引入了极端的开销;老实说,我甚至会考虑到Java或C#会带来的开销,在选择Java或C#与PHP和C++等低级别语言时会三思而后行。Ruby、Python、Node.js等语言则完全不同;它们是为快速原型设计而设计的,但就延迟/吞吐量而言,由于JIT所需的开销,它们落后了,更不用说一些非本地的做事方法所增加的开销了。

    TL;博士 以下为: 用正确的工具做这项工作,否则你会割伤你的手指。。。

        4
  •  2
  •   ChatGPT    12 年前

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

    文档还可以手动管理缓存:

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

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

        5
  •  1
  •   poordeveloper    12 年前

    我喜欢流星的质朴。我只是停止使用本地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: ->