两个http请求可以一起来吗?如果可以,nodeJS服务器如何处理它?

Akh*_*mar 3 tcp http request request-headers node.js

昨天我做了一些关于 nodeJS 的演讲。有人问我以下问题:

我们知道 nodeJS 是一个单线程服务器,有几个请求到达服务器,它将所有请求推送到事件循环。如果两个请求同时到达服务器怎么办,服务器将如何处理这种情况?

我猜到了一个想法,回复如下:

我想没有两个 http 请求可以同时到达服务器,所有请求都来自一个套接字,因此它们将在队列中。Http请求格式如下:

httpPct格式

请求的时间戳包含在它的标头中,它们可能会根据标头中的时间戳被推送到事件循环。

但我不确定我给了他正确还是错误的答案。

jfr*_*d00 7

我想没有两个 http 请求可以同时到达服务器,所有请求都通过管道发出,因此它们将在队列中。

这部分基本正确。传入连接进入事件队列,其中之一必须首先放入队列中。

如果两个请求同时来自两台服务器怎么办,服务器将如何处理这种情况?

由于服务器在单个进程中的单个套接字上侦听传入 TCP 连接,因此不可能同时有两个传入连接。一个将由底层操作系统处理,稍早于另一个。这么想吧。传入连接是网络连接上的一组数据包。其中一个传入连接将在另一个连接之前获得其数据包。

即使您有多个网卡和多个网络链接,因此两个传入连接可以在完全相同的时刻真正到达服务器,node.js 队列也将通过互斥锁之类的东西保护并发性,并且传入连接之一将抓取互斥量在另一个之前,并在另一个之前放入事件队列。

操作系统首先处理的一个将在另一个之前放入 node.js 事件队列。当 node.js 可用于处理事件队列中的下一项时,事件队列中第一个传入请求将首先开始处理。

由于 node.js JS 执行是单线程的,因此请求的代码处理将运行其同步代码完成。如果它有一个异步操作,那么它将启动该异步操作并返回。这将允许处理事件队列中的下一项,第二个请求的代码将开始运行。它将同步运行到完成。与第一个请求一样,如果它有一个异步操作,那么它将启动该异步操作并返回。

在这两个请求都开始异步操作然后返回之后,然后就到事件队列了。当其中一个异步操作完成时,它会将另一个事件发布到事件队列,当 node.js 的单线程空闲时,它将再次处理事件队列中的下一项。如果两个请求都有大量异步操作,它们的进度可能会交错,并且两者都可能在触发异步操作的同时“进行中”,然后返回,直到异步操作完成,当 node.js 再次启动它们的处理时自由处理下一个事件。

请求的时间戳包含在它的标头中,它们可能会根据标头中的时间戳被推送到事件循环。

这部分不太对。相同类型的传入事件在到达时被添加到队列中。第一个到达的首先进入队列 - 没有任何步骤检查某个时间戳。