昨天我做了一些关于 NodeJS 的演讲。
有人问我以下问题:
我们知道nodeJS是一个单线程服务器,多个请求是
到达服务器并将所有请求推送到事件循环。如果什么
两个请求同时到达服务器,服务器将如何处理
处理这种情况?
我猜到了一个想法并回复如下:
I guess 没有两个 http 请求可以完全相同地到达服务器
时间,所有请求都通过单个套接字,因此它们将排在队列中。 HTTP
请求具有以下格式:
请求的时间戳包含在其标头中,并且可以根据标头中的时间戳将它们推送到事件循环。
但我不确定我给了他正确还是错误的答案。
我想没有两个http请求可以同时到达服务器,
所有请求都通过管道,因此它们将排在队列中。
这部分基本上是正确的。传入连接进入事件队列,其中一个必须首先放入队列中。
如果两个请求同时到达两个服务器怎么办?
服务器会处理这种情况吗?
由于服务器正在单个进程中的单个套接字上侦听传入 TCP 连接,因此不可能同时有两个传入连接。底层操作系统将稍微先于另一个处理其中一个。这样想吧。传入连接是网络连接上的一组数据包。其中一个传入连接的数据包将先于另一个传入连接。
即使您有多个网卡和多个网络链接,因此两个传入连接实际上可以在同一时刻到达服务器,node.js 队列也将通过互斥锁之类的东西来保护并发性,并且其中一个传入连接将抢占互斥体在另一个之前,并在另一个之前被放入事件队列中。
第一个被操作系统处理的事件将在另一个事件之前被放入 Node.js 事件队列中。当 node.js 可用于处理事件队列中的下一个项目时,事件队列中第一个传入的请求将首先开始处理。
因为node.js JS执行是单线程的,所以处理该请求的代码将运行其同步代码来完成。如果它有异步操作,那么它将启动该异步操作并返回。然后,这将允许处理事件队列中的下一个项目,并且第二个请求的代码将开始运行。它将同步运行直至完成。与第一个请求一样,如果它有异步操作,那么它将启动该异步操作并返回。
此时,在两个请求开始异步操作然后返回之后,就只剩下事件队列了。当其中一个异步操作完成时,它将向事件队列发送另一个事件,当 Node.js 的单线程空闲时,它将再次处理事件队列中的下一项。如果两个请求都有大量异步操作,则它们的进度可能会交错,并且在触发异步操作时都可能同时“进行中”,然后返回,直到异步操作完成,当 Node.js 启动时,它们的处理会再次开始。可以自由地处理下一个事件。
请求的时间戳包含在其标头中,它们可能是
根据标头中的时间戳推送到事件循环。
这部分不太正确。相同类型的传入事件在到达时会添加到队列中。第一个到达的首先进入队列 - 没有任何步骤检查某些时间戳。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)