节点应用程序中长时间运行的查询与处理
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 应用程序中处理它的利弊以上是关于节点应用程序中长时间运行的查询与处理的主要内容,如果未能解决你的问题,请参考以下文章