为啥 Node.js 具有可扩展性?
Posted
技术标签:
【中文标题】为啥 Node.js 具有可扩展性?【英文标题】:Why is Node.js scalable?为什么 Node.js 具有可扩展性? 【发布时间】:2013-06-01 17:12:51 【问题描述】:node.js 可扩展,那是什么意思? node.js 服务器的哪一部分是可扩展的。我读到它是一种单线程技术,不适合需要大量 CPU 资源的应用程序。这些事实不符合可扩展性,那么这是什么意思?
【问题讨论】:
重复:Scaling node.js. @Jason 我不是在寻找技术编码答案 那篇文章强调了可扩展性,包括负载平衡和 redis。 @vuvu 如果您不是在寻找技术编码答案,那么您的问题太宽泛,不属于 ***。 【参考方案1】:node 运行的 javascript 是单线程的,但是你在 node 中调用的很多东西——比如网络或文件 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
【讨论】:
从数据库读取或更新数据库等操作是阻塞的还是非阻塞的?这与 RDBMS 无关。你会为此类应用推荐 Node 吗?【参考方案2】:这不是“本身”更具可扩展性吗? 您所做的不仅仅是(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 密集型工作的具有适当多线程的语言。
【讨论】:
【参考方案3】:由于负载平衡,它是可扩展的。本质上,您可以让节点处理多个作业,并且它可以处理它而没有很大的负担。这使其具有可扩展性。
【讨论】:
负载均衡是如何实现的?【参考方案4】:Node 的所有 API 都是这样编写的,它们都支持回调。
例如,读取文件的函数可以开始读取文件并立即将控制权返回到执行环境,以便执行下一条指令。一旦文件 I/O 完成,它将调用回调函数,同时将文件内容作为参数传递给回调函数。因此没有阻塞或等待文件 I/O。这使得 Node.js 具有高度可扩展性,因为它可以处理大量请求而无需等待任何函数返回结果。 -- 教程要点。
【讨论】:
以上是关于为啥 Node.js 具有可扩展性?的主要内容,如果未能解决你的问题,请参考以下文章
在 Elastic Beanstalk 上扩展 Nginx - Node JS