【问题标题】:Meteor server restarts itself upon slow requestsMeteor 服务器在缓慢的请求时自行重启
【发布时间】:2019-11-05 22:27:34
【问题描述】:

我有一个 Meteor 应用程序正在执行一些当前挂起的呼叫。我正在一个循环中处理很多项目,然后将其更新到服务器端 Mongo。 (我认为这是异步完成的)我理解循环中的 upserting 不好

这整个功能似乎使应用程序挂起一段时间。我什至注意到控制台中出现了 sock.js 和 websocket 错误。我认为这都是由于 DDP、异步 Mongo upserts 和缓慢的请求。 这是我所说的一些伪代码

for (1..A Lot of records) {
    //Is this async?
    Collection.upsert(record)
}

最终这个功能会完成。但是,我会注意到 Meteor “重新启动”(我认为这是真的,因为我看到 Accounts.onLogin 再次被调用。这几乎就像客户端在慢速请求实际完成后刷新一样。这导致看起来像无限循环。

我的问题是为什么应用程序正在“重新启动”。这是由于框架中的某些东西以及它如何处理缓慢的请求吗? IE。它是否会将所有错误请求排队并最终自动重试?

【问题讨论】:

    标签: javascript node.js mongodb meteor


    【解决方案1】:

    我不确定这里到底发生了什么,但听起来客户端在“忙”时无法访问服务器,然后通过 DDP 的客户端连接超时,并以客户端刷新。服务器进程可能不会重新启动。

    改善这一点的一种技术是在您的数据库中实现一个队列。一段代码检测到有一堆数据库 upserts 要做,所以它将信息记录在一个用作队列的表中。

    您设置了一个 cron 作业(使用例如 npm 模块 node-cron)定期查找队列中的内容 - 当它找到未处理的记录时,它会执行所需的 upsert 工作,然后更新状态将队列记录中的值设置为“完成”,或者只是将其从队列中删除。您可以决定一次处理多少条记录,以尽量减少中断。

    另一种方法是在服务器上的另一个节点进程中进行处理,基本上就像一个工作进程。如果这个过程很忙,它不会影响你的前端。可以使用相同的排队技术来确保这也不会陷入困境。

    这样你会失去一点反应性,但考虑到它是某种批量过程,这应该没关系。

    【讨论】:

    • "然后通过 DDP 的客户端连接超时,并以客户端刷新结束。服务器进程可能不会重新启动。"很有意思。您是否有任何信息会导致您怀疑这一点?另外,我喜欢您将 upsert 委托给另一个进程和/或排队机制的解决方案。问题是,我可能会担心反应性等等。我认为对我来说最好的解决方案是优化数据库逻辑,以便我可以用 1 次命中(批量)更新所有记录
    • 这是猜测,但服务器应该等待查询完成。检查您的日志以查看服务器进程是否正在重新启动。如果您还没有控制台日志语句,请在启动时添加控制台日志语句
    • 我看到 Accounts.onLogin 一次又一次地被调用。但我没有看到任何迹象表明服务器实际上正在重新启动。就像您保存更改时显示“Meteor 服务器已重新启动”
    猜你喜欢
    • 2012-06-24
    • 2018-06-26
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多