Meteor收集方法调用等待,或者如何高效地实现批处理DB操作

Meteor收集方法调用等待,或者如何高效地实现批处理DB操作,meteor,Meteor,我们正在使用Meteor开发一个高度交互的设计工具。自从去年我们迁移到Meteor以来,Meteor为我们做了大量的工作。它大大简化了我们的发展。但最近我们发现我们的应用程序存在一个很大的性能问题 经过深入调查,我发现这是由于我们如何更新数据库。我们的应用程序是一个相当复杂的设计工具,每个用户项目都有大量数据。当用户对设计进行更改时,它将运行逻辑,然后在数据集合中创建、更新和删除数百甚至数千个小对象。由于收集操作在客户端具有存根方法,因此UI更新非常快,而且感觉性能非常好。但在服务器端,它的速度

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

经过深入调查,我发现这是由于我们如何更新数据库。我们的应用程序是一个相当复杂的设计工具,每个用户项目都有大量数据。当用户对设计进行更改时,它将运行逻辑,然后在数据集合中创建、更新和删除数百甚至数千个小对象。由于收集操作在客户端具有存根方法,因此UI更新非常快,而且感觉性能非常好。但在服务器端,它的速度可能会大大降低。由于成百上千的DB操作生成方法调用,它只能一个接一个地运行。服务器进程可以在几秒钟内占用100%的CPU使用率,即使只有一个用户进行一个小的更改。我使用Kadira分析服务器,发现有些方法花费99%的时间等待


解决方案之一是批处理DB操作,但meteor不支持它。有没有关于如何实施这样一个解决方案的想法?或者一般如何规避大量的db运行问题?我在这个问题上有点纠结,欢迎提出任何建议。谢谢。

Meteor在MongoInternals中公开了节点Mongodb驱动程序连接。那个司机

因此,以下方法应该有效:

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());
如果您想使用它,代码正在运行


仅进行批量插入可能无法完全避免性能问题。

我开始了讨论。不,大容量插入无法解决问题,因为问题在于oplog如何影响CPU使用率,CPU使用率随连接用户数乘以数据库操作数而变化。这需要在Meteor中从架构上加以修复。在我的应用程序中,我有一个临时的解决方法,在连接大量客户端时,尽量减少数据库操作的数量。谢谢。但我认为我的应用程序需要更新客户端,以便用户界面能够反应性地更新。所以我意识到批量操作API可能无法解决这个问题。正如安德鲁所说。现在我有了一个改变数据结构的想法。我不会将这些不同的数据存储在单独的集合中,并像在关系数据库中一样对它们进行建模,而是尝试使用一个大型嵌套文档对问题进行建模,这样我就可以将数百个小型数据库操作简化为一个大型数据库更新操作。我认为这应该行得通。我将更改我的应用程序,稍后在此处报告结果。我认为您的等待时间不是由oplog cpu使用问题造成的。听起来更像是从客户端实现了一系列db调用,而不是编写一个方法调用来管理整个操作系列。Kadira中的等待时间都与特定客户机的方法队列和初始发布相关,并按名称列出它们。修正等待时间可能仍然会留下Andrew描述的cpu速度慢的问题,但它仍然应该被修正。我编写的批处理方法是反应式的,可以有一个用于延迟补偿的存根,之所以提供它,是因为这是您的问题所要求的。