Node.js是否真的增加了可伸缩性?


21

我一直在阅读有关C10K问题的信息,特别值得注意的是引用异步服务器I / O的部分。http://www.kegel.com/c10k.html#aio

我相信,这可以通过允许线程处理用户请求,同时依靠I / O中断(事件)通知线程已完成的工作,而不是由线程负责完成工作来总结Node.js在服务器上的工作。完整的CPU工作。线程可以继续执行其他操作(非阻塞),并在完成工作时得到通知(例如,找到文件或压缩视频)。

因此,这意味着套接字更“可用”线程,因此服务器上的用户也可以使用该线程。

然后我发现了这一点:http : //teddziuba.com/2011/10/straight-talk-on-event-loops.html

这里的作者声称,尽管事件驱动框架(中断线程)可以释放线程,但实际上并没有减少CPU要做的工作量!这里的基本原理是,例如,如果用户请求压缩他们上传的视频,则CPU仍然必须实际执行此工作,并且在执行该操作时将处于阻塞状态(为简单起见,请在此处忘记并行性-除非您更了解!)。

我是一个简单的编码器,不是服务器管理员或类似的人。我只是想知道:Node.js是来自“云计算”之神的礼物还是全是热销的东西,实际上不会通过改善可扩展性来节省公司的时间和/或金钱吗?

非常感谢。


12
首先是一个巨魔,其次是node.js,它是用于IO绑定应用程序而不是CPU绑定应用程序。您想要的是两者的结合。任何与CPU绑定的内容都会进入新线程/进程。任何受IO约束的事件都会进入事件循环。
雷诺斯2011年

1
+!那家伙绝对是一个巨魔。
Patrick Hughes

这取决于您所比较的内容-如果您仍然使用Apache(由于某种原因)-那么Node是天赐之物,但是如果将它与Nginx进行比较-改进就不那么激烈了,Node甚至更慢。(生成响应的速度要慢10倍,即2毫秒和20毫秒,BUT在我们的测试中,Nginx在中等负载下给出504,而Node给出正常响应)。
2011年

现在您提到了,伙计们显然是一个巨魔。@ c69这是个很好的信息,非常感谢。
亚历克斯(Alex)

您的“事件循环直接对话”链接不再起作用。
罗伯特·哈维

Answers:


20

当然,任何受CPU约束的工作都将利用CPU。它将以您使用的任何语言或框架来阻塞CPU。

当您进行I / O绑定而不是CPU绑定时,Node.js非常适合。尽管可以做到,但我不会在Node中进行繁重的工作。Node.js解决了实际的问题,而不是像斐波那契数字服务器这样的虚构或想象中的问题。这不是“热空气”。


只是检查一些基准测试,确实确实可以更快地在网页上投放:zgadzaj.com/… ..我想这就是我所追求的……
Alex

3
@AlexW:关于这些基准测试的好处是,您实际上是在提供静态内容。看到我的《每日精选数百万》。为此,旋转PHP解释器是浪费的。查看类似node-static的文件目录服务。
乔什·K

@AlexW,提醒一下zgadzaj.com/…使用的是node.js 0.1.103,现在已经很旧了!
2011年

4

尽管C10K论文在实现细节方面有些过时,但基于事件的并发(反应堆模型)在某些方面仍优于抢先式调度。例如,抢先式调度模型可以在线程被IO阻塞时调度线程。这可以使节点(以及其他工具,如Ruby的Event Machine和Python的Twisted)可以通过花费更多时间进行实际工作和减少时间阻塞来更好地利用可用周期。


-1

多线程仍然可以提高性能。最初的解释是愚蠢的,因为它不考虑存在多个核心。一旦拥有多个内核,线程就不再是线程。它们是超线程。与单线程应用程序相比,任何线程密集型应用程序都将从中受益。


2
但这并不能真正解释Node.JS的狂热。Node.JS的主要优点是它能够快速处理和分派单个线程的多个请求,而不能有效地处理繁重的后台工作负载,而您的答案无法解决这些工作负载。
罗伯特·哈维

node.js的主要好处是前端和后端使用单一语言。所有其他这些主张只是使它显得更加重要而已。
whatsisname 2016年

2
@whatsisname单线程并发是一个巨大的好处,比我认为使用单一语言要大得多。
pllee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.