5

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

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

它有什么神奇之处?

4

2 回答 2

6

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

相比之下,经典的 Web 服务器在前一个请求完全完成之前不会处理另一个请求。为此,Apache 同时运行多个进程;假设有 10 个httpd进程,这通常意味着可以同时处理 10 个请求 (*)。如果进程需要更多时间来完成,您将提供更少的请求 - 或者将不得不产生更多进程,即使该进程什么都不做 - 比如等待数据库咀嚼并返回数据。

一个 node.js 进程,面对一个将进入数据库的请求,让数据库继续工作,同时它去服务另一个请求。

*) MPM 使这不太正确,但对于所有意图和目的来说都足够正确。

于 2012-05-12T11:33:00.703 回答
0

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

另一方面,Javascript本质上是非阻塞的(并且可以传导异步代码)=>在这里您为事件注册一个回调,并且每当它发生时,都会执行一些回调函数。它不会在任何时候阻塞等待这个事件。

您可以通过阅读有关非阻塞或异步服务器的信息来了解更多信息。

于 2012-05-12T11:44:44.107 回答