节点应用程序中长时间运行的查询与处理

Posted

技术标签:

【中文标题】节点应用程序中长时间运行的查询与处理【英文标题】:Long running query vs processing in node application 【发布时间】:2017-09-18 19:42:49 【问题描述】:

我有两个系列。一个集合是 band_profiles 约 15,000 个文档和一个 player_profiles 集合约 500,000 个配置文件。一个玩家可以加入一个乐队,一个乐队最多可以容纳 100 名玩家。这些信息纯粹是信息性的,我没有设计我的数据库关系。 BandProfile 文档包含必要的 PlayerProfile 信息。

所有信息都来自第三方 API,因此 PlayerProfile 可以比 BandProfile 更新更多,反之亦然。为了找到未知的乐队,我扫描所有 PlayerProfiles 并检查未知的乐队 ID。

我的问题:

这两个集合都非常大,我能够通过聚合查询找到未知 id,该查询需要大约 40-120 秒才能运行当前数据集。由于我的 MongoDB 上的 CPU 使用率很高,我很担心,我考虑尝试一些选项。

我认为我可以在我的 Express 应用程序中处理数据。我在两个集合上都使用了find() 来获取整个集合数据。之后我在 Express 中处理了数据,我注意到 RAM 增加了 4gb,CPU 增加了 30%(本地主机上的 1 个调试实例)。

因此我想知道:处理如此大的数据集的最佳方法是什么?使用长时间运行的 MongoDB 查询是否可以,或者我应该为此目的在 Express 中处理我的数据?由于这是一个“BackgroundTask”,它不应该影响我网站的性能。

【问题讨论】:

【参考方案1】:

取决于你对那些大型数据集的新鲜度的关心程度。

1.不太新鲜的数据方法

您可以制作 mongoDB 的副本集并在那里处理长聚合查询。

2。更新鲜的数据方法(取决于 CPU 功率/代码效率)

您可以使用非聚合查询获取数据集并在 Node.js、javascript 中进行这些计算。

【讨论】:

我关心的只是性能/资源。我注意到当我在那里处理数据时,节点应用程序将使用大量内存和 CPU。我假设是因为它会维护我用猫鼬选择的整个系列。 MongoDB 也会使用大量 CPU,但我也不知道在 MongoDB 与 Node 应用程序中处理它的利弊

以上是关于节点应用程序中长时间运行的查询与处理的主要内容,如果未能解决你的问题,请参考以下文章

处理 ASP.NET 中长时间运行的进程

如何确保我的 get 查询不会受到 COSMOS db 中长时间运行的更新的影响?

在iphone中长时间在后台运行应用程序

在 JDBC 中停止或终止长时间运行的查询

Linux中长时间运行程序的方法

Azure App Service 和 .NET Core 3.1 中长时间运行计算的适当解决方案?