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