nodejs – 为什么Node.js可以处理大量的simulteneous持久连接?

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

我想知道如何实现这一点。 我的意思是无论如何它使用TCP / IP封装的底层操作系统,为什么它可以处理永久连接,以至于其他人不能?

它有什么神奇的东西?

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

相比之下,传统的Web服务器将不会提供另一个请求,直到前一个完全完成。 为此,Apache同时运行几个进程; 假设有10个httpd进程,通常意味着可以在任何时候(*)提供10个请求。 如果进程需要更多的时间才能完成,那么您的请求就会减less – 或者即使进程没有任何作用,也不得不产生更多的进程,比如等待数据库咀嚼和返回数据。

一个node.js进程,面对一个请求将进入数据库,离开数据库工作,而它将服务于另一个请求。

*)MPM使这不完全正确,但足以满足所有意图和目的。

那么,事情是,大多数Web服务器(如Apache等..)使用线程产卵,其中他们spook一个新的线程,每个传入的HTTP请求。 这些线程在本质上是同步的和阻塞的,这意味着它们将按照写入的顺序执行代码,并且任何进一步的计算将被当前的I / O或计算任务阻塞。 就像如果你想听聊天聊天提交的事件,你需要有一个专门的线程为每个用户(每个用户是必要的维持持续连接,有几个可能的优化技术,但你仍然可以假设线程是每用户)听这个事件,这个线程将被阻塞,等待这个事件发生。 所以任何线程产卵和阻塞的Web服务器

另一方面,Javascript是非阻塞的(对于asynchronous代码来说),这里你注册了一个事件的callback函数,每当它发生的时候,一些callback函数将被执行。 它不会阻止任何等待这个事件。

通过阅读有关非阻塞或asynchronous服务器的信息,您可以find更多信息。