【问题标题】:MeteorJS queries are super slow if users have active sessions如果用户有活动会话,MeteorJS 查询会超级慢
【发布时间】:2018-05-01 04:47:02
【问题描述】:

在我的 Meteor 应用程序中,我有一个对文档执行一些操作的函数。它首先获取数据,进行一些服务器端调整,然后再次更新文档属性。我有时需要在许多文档上运行它(数千个,最多 250k)。

1000个文档正常速度在2s以下(一个一个地获取文档,经过一些本地数据处理后,一个一个地更新,没有批量更新,所以运行的比较快)。但是,如果网络服务器已经运行了一段时间,并且用户已经登录,则运行此功能需要很长时间(例如 1000 个文档需要 160 秒)。

我必须注销所有用户(db.users.update({}, {$set: {"services.resume.loginTokens": []}}, {multi: true}) )才能恢复速度.运行数据库查询后,执行速度又回到了 ~2s/1000。

有什么问题?它不应该与索引相关,因为它会慢得多。此外,DB 端没有日志表明 DB 是问题所在,并且 DB 没有任何高 CPU 使用率。虽然网络服务器以 100% 运行(除此之外,网络服务器从未达到 15%)。

网络服务器是 AWS T2.small,登录用户的数量(反正他们是空闲的,就像我在晚上做的那样)大约是 10。我假设他们有一些开放订阅。

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    听起来这是一个与观察者相关的问题,因为每个登录用户都可能订阅了正在更新的文档集。

    我会尝试的第一件事是以MongoDB Bulk Operation 的身份进行操作。这样所有文档都会立即更改,并且观察者和订阅将在更新完成后运行,而不是在每次更改后运行。

    示例given in the Meteor guide 特定于 Todos 示例应用,但让您了解如何在 Meteor 中设置和运行批量操作:

    // This is how to get access to the raw MongoDB node collection that the Meteor server collection wraps
    const batch = Lists.rawCollection().initializeUnorderedBulkOp();
    
    //Mongo throws an error if we execute a batch operation without actual operations, e.g. when Lists was empty.
    let hasUpdates = false;
    Lists.find({todoCount: {$exists: false}}).forEach(list => {
      const todoCount = Todos.find({listId: list._id}).count();
      // We have to use pure MongoDB syntax here, thus the `{_id: X}`
      batch.find({_id: list._id}).updateOne({$set: {todoCount}});
      hasUpdates = true;
    });
    
    if(hasUpdates){
      // We need to wrap the async function to get a synchronous API that migrations expects
      const execute = Meteor.wrapAsync(batch.execute, batch);
      return execute();
    }
    

    其他选项包括消除数据处理的反应性,因此更新不会全部自动发送到客户端。哪个比较复杂

    【讨论】:

    • 我相信这是正确的答案,谢谢!我将不得不弄清楚如何解决它,因为更新代码非常复杂(360 行)并且为每个文档生成唯一的数据。一旦我获得更多用户,它可能会导致更多问题,因为每次更新都应该重新触发所有用户的观察者(但每个人都应该只订阅自己的数据)。无论如何,有多少人使用 Meteor?我在新西兰找不到任何东西:-(。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2017-05-07
    • 2018-10-10
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多