处理cpu绑定操作

时间:2016-09-20 22:30:03

标签: node.js mongodb

我们知道Node.JS以异步单线程方式工作。 我已经和MongoDB合作了好几个月了,说实话,我发现查询语言不那么强大,不如说好。聚合框架带来了重要的功能,但是像内部查询这样的SQL功能非常多(注意我并不是在谈论大规模连接)。 所以我发现自己多次为这种缺乏提供可怕的结果集遍历(foreach)以便塑造我想要的结果。

显然,大型数据集无法实现。在Node.JS环境中,这些事情是真正的灾难,因为我阻止整个服务器提供单个请求。

你如何处理这些cpu绑定任务?

2 个答案:

答案 0 :(得分:1)

实际上整个Node.js架构基于单线程事件循环,因此任何CPU绑定函数都会阻塞整个服务器,直到函数完成其操作。

可能的解决方法之一可能是

  • 将您的服务划分为多个并行node.js应用程序;
  • 使用多个核心,并行工作人员在不同核心上执行。

看一下这篇文章:Why you should use Node.js for CPU-bound tasks

答案 1 :(得分:0)

理想情况下,您不会重建结果。您设计了MongoDB可以处理的查询以获得您想要的结果...打开与该特定问题相关的问题可能会更好,因为可能存在您遗漏的问题。

但是,假设您确实发现了一个异常(这不太可能),并且您需要构建一大堆数据,这些数据存在瓶颈。这个操作很有可能再次优化......你应该打开一个与这个问题相关的问题,看看可以做些什么改进。

让我们说你确实是一个非常罕见的例外,所有上述内容都不适合你。您有几个(更复杂的)选项可供选择:

  1. ClustersChildProcess - 允许您将进程独立作为一种并发形式。
  2. RabbitMQZeroMQ - 消息队列是另一种允许并发的工具,请注意还有其他库可用
  3. MySQLPostgres - 如果您对它更好,请迁移回SQL。编写一个从MongoDB读取的脚本,然后在新数据库中执行INSERT,然后编写所需的查询
  4. 请注意选项1&上面的图2还允许您与其他更适合处理大量数据的语言进行交互。