我有6000股票的10M文件的集合,股票名称被编入索引。当我订购一种新股票时,流星挂起超过10秒钟以获得该股票的大约3000份文件。同样在几个股票订阅后,流星挂起100%CPU使用率。流星看起来非常慢,同步“大”的收集。其实我的应用程序只是只读。我想知道是否有办法为只读客户端加速流星?我也想知道是否为每只股票创建一个单独的集合有帮助?流星的订阅和同步缓慢
回答
虽然这是一个规模问题,可能还有待改进;应该注意的是,您正在使用错误的技术来完成您的任务,因为流星意味着客户端之间的交互,而不是用于检索大量的只读时间敏感数据。虽然状态跟踪屏幕可能还是有点意义的,但大量的时间关键数据肯定不会...
整个Meteor堆栈在任何本地堆栈中引入了一个简单实现的极度开销;说实话,我甚至会考虑Java或C#会在PHP和C++等低级语言之间进行选择时引入和思考的开销。像Ruby,Python,Node.js和其他语言真的是一个不同的故事;它们用于快速原型设计,但是由于它们需要花费的时间和吞吐量,所以它们需要对它们进行JIT处理,而不是在开销时忘记一些非本地方法来增加功能。
TL; DR:使用这个职位的合适的工具,否则你会割伤手指...
我爱流星的简单。我只是停止使用本地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: ->
流星将整个数据集推送到您的客户端。
您可以通过删除包自动发布关闭自动发布:
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会自动改变,新的数据集将发送到客户端。
您可以将其用作控制发送给客户端的数据量和数据量的一种手段。
正如另一张海报说,你真的不得不问这是否是这份工作的最佳工具。流星意味着相对较小的数据集,可以在两个方向进行实时更新。它经过大量优化,并为该用例提供大量脚手架。
对于另一个用例(例如只读大数据集),它可能没有意义。它有很多开销,提供了你不打算使用的功能,并且你将编码以获得你需要的功能。
启用autopublish后,您可能会看到Mongodb中大量文档的性能问题。您可以通过删除自动发布和编写代码来解决此问题,以仅发布相关数据而不是整个数据库。
该文档也进入手动管理缓存:
复杂的客户端可以打开订阅和关闭,以控制 多少数据保存在缓存和管理网络流量。订购 关闭后,其所有文档将从 高速缓存中删除,除非同一个文档也由另一活动 订阅提供。
目前正在对Meteor进行其他性能改进,包括支持“大量客户端”的DDP级代理。你可以在流星roadmap上看到更多细节。
我一直在努力解决同样的问题。在我的情况下,我只需要同步约3000条记录,总共大约30KB。经过数周的尝试,我终于意识到同步不是问题,但似乎是同步时发生的LiveHTML更新。
通过在初始页面加载期间禁用模板更新,我可以将300(过滤)记录的页面加载时间从10秒减少到所有3000条记录的时间小于2秒。我做到了这一点,加入的条件所定义的模板内容的功能:
前(300条记录10秒页面加载由服务器发布):
Template.itemlist.items = function() {
return Item.find({type: 'car'},
{sort: {start: -1},
limit: 30});
};
向(2S页面加载了3000条记录由服务器发布):
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);
}
});
});
- 1. 流星和订阅
- 2. 反应和流星订阅
- 3. 流星订阅undefined
- 4. 流星js发布和订阅的反应很慢
- 5. 流星订阅覆盖旧订阅吗?
- 6. 与WebStorm和流星的缓慢?
- 7. 流星订阅不停止
- 8. “链接”流星订阅
- 9. 流星订阅准备
- 10. 理解流星订阅
- 11. 流星订阅计数
- 12. 流星订阅连接
- 13. 订阅集合(流星)
- 14. 流星发布/订阅
- 15. 流星:订阅不工作
- 16. 流星安全订阅和发布
- 17. 流星路线和自动订阅
- 18. 流星发布和订阅不工作
- 19. 流星仪表板和发布/订阅
- 20. 流星和骨干同步
- 21. 在流星中强制重订订阅
- 22. 路由器中的流星订阅
- 23. 根据流星中的日期订阅
- 24. 流星订阅回调运行时订阅包含以前的订阅导致
- 25. 如何在停止订阅流星后重新订阅?
- 26. 如何关闭订阅流星
- 27. 流星数据订阅策略
- 28. 流星发布/订阅错误
- 29. 流星铁路由器等待订阅
- 30. 如何使流星订阅反应?
我个人希望能够用这种负载工作。在当时编辑+ - 10Mb的数据集应该不成问题。目前的问题似乎是,同步第一个4-5Mb的速度非常快,然后慢了很多。 – Thierry
嗨,汤姆,我很欣赏你使用win.meteor.com所做的工作! 关于上面的问题,不能在流星中管理,如下所示? –
@MaxHodges:我没有说你“不能”,我说这只是“错误的”。如果以正确的方式使用该技术,则可以获得相当的性能,但是无法达到低级别语言可为您提供的性能。如果你能承受数据的轻微延迟,为什么不;但是一旦你准备好了时间,生活和金钱等重要的东西,你真的需要重新考虑...... –