我正在尝试制作一个相当大的流星应用程序,我注意到它在过去几天变慢了,我在流星论坛上看到出版物可能导致加载时间缓慢。在我对应用程序本身进行更改(代码更改)后刷新页面后,单次更改通常需要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());
答案 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在服务器上低,应用程序更快。我希望它为你工作。感谢