为什么Node.js可扩展?

node.js可伸缩,那是什么意思? node.js服务器的哪一部分是可伸缩的。 我读到这是一个单线程技术,不适合需要大量CPU资源的应用程序。 这些事实不符合可扩展性,所以这是什么意思?

节点运行的JavaScript是单线程的,但是在节点中调用的很多东西(比如networking或文件io)在后台线程中运行。 查看这篇文章的基本概述: 节点不是单线程的

如果你需要细节的话,你应该看看libuv,它是把事件循环转换成事件循环的“魔术”部分: http : //nikhilm.github.io/uvbook/basics.html#event-loops

此外,如果您需要在节点本身中执行一些CPU密集型操作,则可以将其轻松发送到subprocess – 有关详细信息,请参阅http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options

这不是更可扩展的“本身”。 更多的是你所做的只是(I / O)扩展而不需要做任何特殊的事情。

I / O更安全并且更容易并行执行,因为它倾向于在执行线程之间不共享数据。 Node.js可以让你使用事件编程,这是简单,优雅和易于使用。 是一个古老的,经过validation的编程范例,多年来一直由GUI和其他graphics密集型应用程序(例如游戏)使用。

事实上,比完全成熟的语言(如c ++,c,java等)可扩展性要差一些,使用完整的multithreading可以扩展得更好。 这也允许扩展CPU,但也打开一jar蠕虫。 要共享CPU,你必须共享数据,这是另一个故事(信号量,锁等…)

您可以使用上述任何一种语言来执行node.js,但不是语言本身的一部分,所以您必须自行开发或使用提供给您的库。 这就是说,并不难,但肯定比node.js更难。

大多数Web服务都是IO绑定的,所以Node.js很合适,而且在大多数情况下都可以。 但是,一旦开始使用CPU密集型工作,事件不会得到服务,并且会停下来。 在这种情况下,最好用另一种语言。 Node中没有一个很好的解决scheme。 你可以产生多个进程,但是你将无法在它们之间共享数据。 没有数据共享,就无法高效地扩展CPU,所以最好不要尝试。

对于IO使用Node.js,而对于CPU密集型工作,则使用适当的multithreading语言。

它由于负载均衡而可扩展。 本质上,您可以为节点处理多个作业,并且可以处理它,而不会有太大的负担。 这使得它可以扩展。

Node的所有API都是这样写的,它们支持callback。

例如,读取文件的函数可能会开始读取文件,并立即将控制权交还给执行环境,以便执行下一条指令。 一旦文件I / O完成,它将在传递callback函数的同时调用callback函数,文件内容为参数。 所以没有阻塞或等待文件I / O。 这使Node.js具有高度的可扩展性,因为它可以处理大量的请求,而不用等待任何函数返回结果。 – 教程的要点