流星 - 导致加载时间过长的出版物

时间:2017-09-06 22:07:58

标签: meteor

我正在尝试制作一个相当大的流星应用程序,我注意到它在过去几天变慢了,我在流星论坛上看到出版物可能导致加载时间缓慢。在我对应用程序本身进行更改(代码更改)后刷新页面后,单次更改通常需要1-2分钟。我的出版物有什么问题吗?虽然,当页面加载,我重新加载它加载非常快。

if(Meteor.isServer){
  Meteor.publish('notes', function () {
    return Notes.find()
  });
  Meteor.publish('users', function () {
    return Meteor.users.find()
  });
  Meteor.publish("user", function(){
    return Meteor.user()
  })
  Meteor.publish('notes-newest', function () {
    return Notes.find({}, {sort: {createdAt: -1}, limit: 10});
  });
}

文档示例:

let noteInfo = { title, subject, description, imageURL, userId, userEmail, createdAt }
let title = this.refs.title.value;
let subject = this.refs.subject.value;
let description = this.refs.description.value;
let allUrls = [this.refs.imageURL.value].concat(this.state.urls);
let imageURL = allUrls.filter(function(entry) { return entry.trim() != ''; });
let userId = Meteor.userId();
let userEmail = Meteor.user().emails[0].address;
let createdAt = Date.parse(new Date());

4 个答案:

答案 0 :(得分:2)

这是一个非常广泛的性能调优问题。您还没有告诉我们您的馆藏中有多少文件或这些文件有多大。一些可能的问题:

您通过发布太多文档或因为文档太大而过度发布。例如,当你这样做:

Meteor.publish('notes', function () {
  return Notes.find()
});

如果每个100字节有100,000个Notes文档,那么需要通过网络到达客户端的10 MB。如果每张10KB都有1,000个票据文件,情况也是如此。

解决方案:使用limit限制文档数量和/或减少使用fields传输的字段数量:

Meteor.publish('notes', function () {
  return Notes.find({},{ limit: 100, fields: { key1: 1, key2: 1 }});
});

您的收藏中缺少一个或多个索引。当你这样做时:

Meteor.publish('notes-newest', function () {
  return Notes.find({}, {sort: {createdAt: -1}, limit: 10});
});

如果有1M个备注文档,但createdAt键上没有索引,那么这将非常慢。

解决方案:在createdAt密钥上添加index会使这样的出版物更快。

您有无效的出版物

Meteor.publish("user", function(){
  return Meteor.user();
})

无效,因为Meteor.user()不是游标,并且发布必须返回游标或游标数组。它也是冗余,因为Meteor.user()在客户端上自动可用,尽管它不包含所有密钥。

解决方案:完全删除此不必要的出版物。如果要为当前用户发布客户端上不可用的某些密钥,可以按如下方式进行:

Meteor.publish("user", function(){
  return Meteor.users.find(this.userId,{fields: {services: 1, emails: 1, profile: 1}})
});

答案 1 :(得分:1)

  

在进行更改后刷新页面后,单次更改通常需要1-2分钟。我的出版物有什么问题吗?虽然,当页面加载,我重新加载它加载非常快。

这是什么意思?您的意思是当您更改网站代码时,您的更改需要1-2分钟才能显示在新加载的页面中?这是可以预料的:Meteor需要时间来重建您的应用程序。观看终端的进展情况。

使用大量软件包和外部代码会降低构建速度。编译速度与最终用户的体验无关。

答案 2 :(得分:0)

我对流星项目做的几件事就是发送特定字段" profile.name"我还使用了collection.createIndex({})来创建一个索引并在其中,你可以将你的排序放在服务器启动时创建,并与你的collection.find.sort一起使用。我认为限制你的笔记是非常必要的,因为你对一个而不是另一个有限制。

答案 3 :(得分:0)

它也发生在我身上。那时我用kadira(以前仍然是开源,但现在不是)检查。源代码位于kadira on github,但服务已消失kadira.io

问题在于公开和订阅。当客户请求订阅时,他打开了某种"连接" - 我这样说,它适用于那些称同一出版物的人。想象一下形成了多少个连接。 许多人访问的相同数据必须服务器端必须向mongodb请求数据,对于所有这样的连接都是如此。这就是它变慢的原因。

最后我添加了redis.io

meteor npm install --save redis
meteor npm install --save hiredis

在服务器端:

import { Meteor } from "meteor/meteor";

var redis = require("redis");
var clientRedis = redis.createClient({
    host: "YOURREDIS_IP",
    port: "YOURREDIS_PORT"
});
clientRedis.setSync = Meteor.wrapAsync(clientRedis.set);
clientRedis.getSync = Meteor.wrapAsync(clientRedis.get);

setRedis_Object = function (keyREDIS, timeRefresh, valueREDIS) {
    return clientRedis.setSync(keyREDIS + moment(new Date()).format(timeRefresh), JSON.stringify(valueREDIS));
};

getRedis_Object = function (keyREDIS, timeRefresh) {
    return JSON.parse(clientRedis.getSync(keyREDIS + moment(new Date()).format(timeRefresh)));
};

Meteor.methods({
    getRedis_YOURCOLLECTIONS: function(timeRefresh) {
         var data = getRedis_Object(getRedis_YOURCOLLECTIONS, timeRefresh);
         if (data != null) {
              return data;
         } else {
              var data = YOURCOLLECTIONS.find().fetch();
              setRedis_Object(key, timeRefresh, data);
              return data
         }
    },
});

在客户端

  Meteor.call("getRedis_YOURCOLLECTIONS", "YYYYMMDD", function (error, result) {
      if (error) {
          console.log(error);
      } else {
          Session.set("getRedis_YOURCOLLECTIONS", result);
      }
  });

在我添加这个REDIS消耗内存和CPU在服务器上低,应用程序更快。我希望它为你工作。感谢