为什么Node.js可扩展?

时间:2013-06-05 20:41:17

标签: node.js scalability

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

4 个答案:

答案 0 :(得分:15)

节点运行的javascript是单线程的,但是你在节点中调用的很多东西 - 比如网络或文件io - 都在后台线程中运行。有关基本概述,请参阅此帖子: Node is not single threaded

如果你需要坚实的细节,你应该研究libuv这是什么魔法'将线程转换为事件循环: http://nikhilm.github.io/uvbook/basics.html#event-loops

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

答案 1 :(得分:3)

这不是更具可扩展性"本身"。 更重要的是,您所做的只是(I / O)可扩展而无需做任何特殊的事情。

I / O并行更安全,更容易,因为它往往在执行线程之间不共享数据。 Node.js允许您使用简单,优雅且易于使用的事件编程来完成它。是一种古老且经过验证的编程范例,多年来一直被GUI和其他图形密集型应用程序使用,例如游戏。

实际上,它比c ++,c,java等完全成熟的语言具有更低的可扩展性。通过使用完全多线程可以扩展得更好。这也允许扩展CPU,但也打开了一堆蠕虫。 要共享CPU,你必须共享数据,这是另一个故事(信号量,锁等......)

您可以使用上述任何语言执行与node.js相同的操作,但不是语言本身的一部分,因此您必须自己滚动或使用提供它的库。 也就是说,并不是那么难,但肯定比在node.js中更难。

大多数Web服务都是IO绑定的,因此Node.js非常适合,大多数情况下都可以。但是一旦你开始使用CPU密集型工作,事件就不会得到服务而且一切都停止了。 在这种情况下,最好使用其他语言。在Node中没有真正好的解决方案。您可以生成多个进程,但之后您将无法在它们之间共享数据。如果没有数据共享,就无法有效扩展CPU,所以最好不要尝试。

将Node.js用于IO,以及一些更适合的语言,并使用适当的多线程进行CPU密集型工作。

答案 2 :(得分:2)

由于负载平衡,它可以扩展。从本质上讲,您可以为要处理的节点创建多个作业,并且可以在不显着负担的情况下处理它。这使它具有可扩展性。

答案 3 :(得分:0)

Node的所有API都是以支持回调的方式编写的。

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