Meteor collection方法调用等待,或如何有效地实现批量DB操作

时间:2014-08-29 07:47:39

标签: meteor

我们正在使用Meteor开发一个高度互动的设计工具。自从我们去年迁移到Meteor以来,Meteor为我们做了很多工作。它极大地简化了我们的开发。但最近我们在我们的应用程序中发现了一个很大的性能问题。

经过深入调查,我发现它是由于我们如何更新数据库。我们的应用程序是一个非常复杂的设计工具,它为每个用户项目提供了大量数据。当用户对设计进行更改时,它将运行逻辑,然后在数据集合中创建,更新和删除数百甚至数千个小对象。由于集合操作在客户端具有存根方法,因此UI的更新速度非常快,并且感觉非常高效。但在服务器端,它可以大大减慢速度。由于数百个数据库操作生成方法调用,因此它只能逐个运行。服务器进程可以在几秒钟内占用100%的CPU,即使只有一个用户进行小的更改。我使用Kadira来描述服务器,发现有些方法花99%的时间等待。

其中一个解决方案是批量数据库操作,但流星并不支持它。关于如何实施这样的解决方案的任何想法?或者如何规避一般的db-operation操作问题?我有点坚持这个问题,欢迎提出任何建议。感谢。

1 个答案:

答案 0 :(得分:0)

Meteor暴露了MongoInternals中的Node Mongodb驱动程序连接。那个司机supports bulk inserts

所以下面应该有效:

var meteorCol = new Meteor.Collection( 'yourCollection' );
meteorCol.remove({});
console.log( 'Count :', meteorCol.find().count());  
var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
var mongoCol = db.collection( 'yourCollection' );

//make a synchronous function so the insert can be checked
var mongoInsert = Meteor._wrapAsync( mongoCol.insert ).bind( mongoCol );

//batch insert
mongoInsert([{hello:'world_safe1'}
  , {hello:'world_safe2'}]
  , {w:1}
);

console.log( 'Count :', meteorCol.find().count());

代码正在Meteor Pad中运行,如果你想玩它。

根据this discussion,仅仅执行批量插入可能无法完全避免性能问题。