Node.js是否应该用于密集处理?

比方说,我正在构build一个三层的网站,在后端使用Mongo DB,而在浏览器中使用一些非常轻量级的javascript(比如说,只是对表单进行validation,也许是一些引发AJAX请求的奇特控件)。

我需要为“中间”层select一种技术(我们可以将其分成多个子层,但是这个细节不是这里的重点,只是整个技术的select),在那里我要closures一些原始数据DB,并将其渲染为一些我推送到浏览器的HTML。 一个相当典型的瘦客户端Web架构。

我的安全select是在Java中实现这个中间层,使用像Jongo这样的库来与Mongo DB交谈,也许Jackson可以编组/解组JSON,以便在他们发出AJAX请求时与我的控件交谈。 还有一些用于在服务器上呈现我的HTML的模板框架。

不过,我真的很想把所有的东西都抛出窗口,并且在这个中间层使用Node.js,原因如下:

  • 我喜欢javascript(好的部分),让我们说这个应用程序的业务逻辑比Java更具有performance力。

  • 它的JavaScript到处都是。 在堆栈上的任何位置工作时,无需在语言之间进行切换,实际上也可以使用OO和function范例。 层之间没有翻译pipe道,JSON在本地无处不在。

  • 我可以在客户端和服务器上重新使用validation逻辑。

  • 如果将来我决定在浏览器中执行HTML渲染客户端,那么我可以重用现有的模板,像Backbone一样,只需要很less的重构/重新testing工作。

如果你现在和Node一样,上面的所有内容都显得很明显。 所以我应该select节点吧?

但是…这是我所知道的:我们都知道Node是基于单线程的asynchronousI / O Web服务器模型的。 这对于我的数据服务请求方面的可伸缩性和性能来说非常好,但是我的业务逻辑呢? 那么我的模板渲染呢? 这些东西是不是会对单线程的所有请求造成巨大的瓶颈?

想到两个明显的解决scheme,但他们都不对:

  1. 将“阻塞”业务逻辑保留在那里,只需使用一组Node实例和一个负载平衡器,即可真正并行地处理请求。 好,那么为什么Node不是multithreading呢? 还是总是这样做的想法,保持简单愚蠢,并避免在基本情况下的multithreading复杂性的可能性,使程序员做多余的安装工作,如果多核心处理能力的期望?

  2. 保持单个节点实例,并通过调用某个其他multithreading应用程序服务器上运行的业务逻辑的某个java实现来保持它不阻塞。 好的,这个选项完全无效了我列出的使用Node的每一个亲(事实上它比仅仅使用Java增加了复杂性),除了CRUD请求到数据库的性能和可伸缩性可能的增益外。

这导致我终于到了我的问题的重点 – 我错过了Node的一个巨大的重要难题,我刚刚得到了我的事实完全错误,或者是Node不适合在服务器上处理业务逻辑? 换句话说,Node对于坐在一个数据库上是否有用,并且以比其他一些阻塞I / O的实现更高性能和可扩展的方式服务于许多CRUD请求? 而且你必须在下面的某个层次,甚至是客户端做所有的业务逻辑,以保持合理的性能和可扩展性。

考虑到所有关于Node的嗡嗡声,我宁愿希望它带来更多的东西。 我很乐意相信!

在任何给定的系统上,你都有N个可用的(1-64,或者N碰巧是)。 在任何CPU密集型应用程序中,您将被吞吐量为N cpus。 有没有不可思议的方式来解决这个问题,通过添加超过N个线程/进程/任何。 要么你的代码更高效,要么你需要更多的CPU。 更多的线程不会帮助。

其中一个关于多CPU性能的小小的事实是,如果您需要同时运行N + 1个 CPU密集型操作,则每个CPU的吞吐量会下降不less。 一个CPU密集型的进程在放弃之前往往会持续很长一段时间,而其他的任务却非常糟糕。 在大多数情况下,它阻止了I / O以及伴随而来的任务切换,使得现代OS多任务处理工作的效果也如此。 如果我们每天的更多的常见任务都是CPU限制的,那么我们会发现我们的机器需要更多的CPU。

Node.js为服务器端效率带来的好处是每个线程的彻底使用。 理想情况下,最终只需要更less的任务切换。 这并不是一个巨大的胜利,但是如果有N个线程asynchronous处理N * C连接,将会比在相同数量的CPU上运行的N * C个阻塞线程具有性能优势。 但CPU的底线依然如此:如果你有超过N的实际CPU工作要做,你会感到一些痛苦。

上次查看Node.js API时,有一种方法可以启动一个服务器,每个CPU有一个侦听器和一个工作线程。 如果你能做到这一点,我会倾向于使用Node.js提供一些注意事项:

  • Javascript的无处不在的方法为您带来一些简单性。 对于复杂的事情,我会担心asynchronous编程风格让事情变得更加困难而不是简单。
  • Node.js中的模板处理和其他CPU密集型任务的速度并不比您的其他语言/平台select慢得多。
  • 数据库驱动程序是可靠的。

我可以看到一个缺点:

  • 如果一个线程崩溃,你将失去该线程所服务的所有连接。

最后,请记住,程序员的时间通常比服务器或带宽更昂贵。