nodejs - 为什么Node.js可以处理大量同时的持久连接?

时间:2012-05-12 11:24:09

标签: node.js networking tcp

我知道Node.js擅长保留大量的同时持久连接,例如,许多聊天室的聊天室。

我想知道它是如何实现的。我的意思是无论如何它是使用由底层操作系统封装的TCP / IP,为什么它可以很好地处理持久连接而其他人不能?

它有什么神奇之处?

2 个答案:

答案 0 :(得分:6)

Node.js使所有I / O异步。它只在单个线程中运行,但在等待I / O时会执行其他请求或操作。

相比之下,传统的Web服务器在完成前一个请求之前不会提供另一个请求。出于这个原因,Apache同时运行多个进程;假设有10个httpd个进程,通常意味着可以在任何时间(*)提供10个请求。如果这些过程需要更多时间来完成,那么您将提供更少的请求 - 或者必须生成更多进程,即使进程无效 - 例如等待数据库咀嚼并返回数据。

面向将要发送到数据库的请求的node.js进程在数据库发送另一个请求时使数据库工作。

*)MPM使这不完全正确,但对所有意图和目的都足够了。

答案 1 :(得分:0)

嗯,问题是大多数Web服务器(如apache等)都使用线程生成,它们为每个传入的HTTP请求提供一个新线程。这些线程本质上是同步和阻塞=>这意味着他们将按照编写的顺序执行代码,并且当前的I / O或计算任务将阻止任何进一步的计算。就像你想听一个类似的事件 - 聊天提交聊天你需要为每个用户提供一个专用线程(每个用户是维持持久连接所必需的,几乎没有可能的优化技术,但你仍然可以假设线程是每个user)监听此事件,此线程将被阻止等待此事件发生。因此,任何线程产生和阻止Web服务器

另一方面,Javascript是非阻塞的(并且对异步代码具有导电性)本质上=>在这里注册一个事件的回调,每当它发生一些回调函数将被执行。它不会在等待此事件的任何时候阻止。

通过阅读非阻塞或异步服务器,您可以找到更多相关信息。