2016-09-20 84 views
1

我们知道Node.JS以异步单线程的方式工作。 我已经使用MongoDB好几个月了,老实说,我发现查询语言不是很强大,很好。聚合框架带来了重要的功能,但是像内部查询这样的SQL功能非常之远(注意我并不是在谈论大量的连接)。 所以我发现自己多次提供这个缺乏可怕的结果集遍历(foreach),以形成我想要的结果。处理cpu绑定操作

很明显,它不适用于大型数据集。在Node.JS环境中,这些事情是真正的灾难,因为我阻止整个服务器为单个请求提供服务。

你如何处理这些类型的CPU绑定任务?

回答

0

理想情况下,您不重建结果。您设计了一个MongoDB可以处理的查询,以获得您想要的结果......可能会更好地打开与该特定问题相关的问题,因为可能会丢失某些内容。但是,假设您确实发现了一个异常(这不太可能),并且您需要构建一大组数据来解决瓶颈问题。有一个很好的机会可以再次优化此操作...您应该打开与此问题相关的问题,以了解可以进行哪些改进。


可以说,你确实是一个非常罕见的例外,以上所有都不适用于你。你有几个(更复杂)选项可以选择:

  1. ClustersChildProcess - 允许你独立过程并发性的一种形式。
  2. RabbitMQZeroMQ - 消息队列是另一种工具,允许并发,注意,可用
  3. MySQLPostgres其他图书馆 - 迁移回来,如果你用它更好地SQL。编写一个脚本,从MongoDB的读取和执行插入到新的数据库,然后编写查询你想

请注意选择1 & 2上面还允许您与其他语言,这将是更适合的接口处理大量数据。

+0

这是一个例子http://stackoverflow.com/questions/39474513/real-virtual-field-inherited-fields。最终目的(在问题中没有解释)是获取与每个标签相关的所有文档。基本上是一个SQL GROUP BY,除了docBs从被引用的docA继承标签之外。我在最后一步中用3个步骤和3个嵌套的foreach解决了一个疯狂的异步系列 – alfredopacino

1

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

在可能的解决方法可能是

  • 将您服务于几个并行的node.js applicaitons;
  • 使用多核并行工作在不同核上执行。

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