【问题标题】:Meteor js publish and subscribe is very slow to reactMeteor js 发布和订阅反应很慢
【发布时间】:2017-01-24 21:04:51
【问题描述】:

我已经使用流星发布和订阅方法与客户端和服务器进行交互。现在根据我的场景,我正在使用 D3 js 生成条形图,一旦将数据输入到 mongo db 集合中,我就会使用客户端函数生成条形图。我的问题是发布和订阅反应太慢。即使我限制了 mongodb 返回的文档数量,问题仍然存在。它也不一致,即它有时会在 1 秒内做出反应,而其他时候则需要 4-5 秒。请指导我该做什么以及我的实施有什么问题。

这是服务器端代码,

Test = new Mongo.Collection("test")

Meteor.publish('allowedData', function() {
    return Test.find({});
})

这是客户端代码,

Test = new Mongo.Collection("test")
 Meteor.subscribe('allowedData');
 Meteor.setTimeout(function() {
    Test.find().observe({
    added: function(document){
        //something
    },
    changed:function(){
        //something
    },
    removed:function(){
        //something
    },
    })

【问题讨论】:

  • 我觉得从通用文件中导入Test会更优雅
  • 您是否检查了 TimeLine(在 Chrome 浏览器中)以查看每次操作的加载时间?
  • 您将所有Test 文档发布到客户端,因此毫无疑问会很慢。您应该考虑使用方法来为图表生成数据
  • 使用 Meteor 方法只获取您需要的信息。从客户端完全删除Test.find().observe()。
  • 实际上我需要完成的是,每当在 mongoDB 中添加一个文档时,我都需要在条形图中显示它。所以我需要它是反应性的,因此我使用了 observe()。

标签: javascript mongodb meteor d3.js


【解决方案1】:

从您的 cmets 中,我看到您需要一个反应性的报告图表。即使这是您的要求,拥有这样的图表也太昂贵了。事实上,当您的系统变得更大时,假设您有大约 10000 个文档用于单个图表,这种图表会经常使您的服务器崩溃。

要解决这个问题,我有两个建议:

  • 定义一个返回图表数据的方法。在客户端中设置作业/间隔计时器以定期调用该方法。间隔值取决于您的需要,对于图表来说 10 秒应该没问题。这种方式并不是完全被动的,你只能在一段时间后获得最新的数据,但它仍然比一个缓慢且经常崩溃的系统要好。你可以找到很好的模块来管理作业/计时器here。
  • 使用这个 Meteor 包meteor-publish-join(免责声明:我是作者),它是为了解决你遇到的那种问题:需要在大数据集上进行反应性聚合/连接并且仍然有一个很好的整体性能

【讨论】:

  • 非常感谢您的回答。就您的第一个选择而言,我也是这么想的,但我不允许这样做。但我一定会看看你的第二个选择。
猜你喜欢
  • 1970-01-01
  • 2012-08-31
  • 2014-07-09
  • 2018-03-07
  • 2017-11-30
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多