两个并发请求R1和R2到达node.js
服务器。Node.js
使用单线程T1运行。 T1花费5秒钟处理请求R1。 假设这些时间用于某个大型功能的实际处理,并且没有等待/IO调用。
我的问题是 - 请求R2将在5秒钟后(一旦R1完成)被接管,还是两者(R1和R2)将轮流运行?
如果答案是顺序的(即R2将在5秒后被接管),我的后续问题是假设我有5k个HTTP并发请求,每个请求需要2毫秒,则最后一个请求将在5k * 2ms = 10秒后得到响应。 这不好吗? 我需要进行群集化吗?
两个并发请求R1和R2到达node.js
服务器。Node.js
使用单线程T1运行。 T1花费5秒钟处理请求R1。 假设这些时间用于某个大型功能的实际处理,并且没有等待/IO调用。
我的问题是 - 请求R2将在5秒钟后(一旦R1完成)被接管,还是两者(R1和R2)将轮流运行?
如果答案是顺序的(即R2将在5秒后被接管),我的后续问题是假设我有5k个HTTP并发请求,每个请求需要2毫秒,则最后一个请求将在5k * 2ms = 10秒后得到响应。 这不好吗? 我需要进行群集化吗?
如果
R1
是同步的,那么只有在R1
完成后才会开始执行R2
。
简而言之,您可以搜索nodejs事件循环
。有很多优秀的文章解释了Node.js如何使用事件循环来处理请求。
事件循环是Node.js实现非阻塞I/O操作的关键 —— 尽管JavaScript是单线程的 —— 它能够在可能的情况下将操作转移给系统内核。(来源:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/)
您是正确的,Node.js是单线程的。如果长时间运行的任务导致其被阻塞,则无法处理任何其他内容。在您的情况下,您应该将R1
拆分为较小的异步处理部分,或者您可以使用child_process
将操作转移到另一个线程。
如果答案是顺序的(例如,
R2
将在5秒后开始),我的后续问题是,假设我有5k个HTTP并发请求,每个请求需要2毫秒,那么最后一个请求将在5k * 2ms = 10秒后被服务。这不好吗?我需要在这里进行集群吗?
这取决于情况。2毫秒实际上是计算机处理很多事情的时间较长。在进行集群之前,您应该像上面提到的那样重构代码以最小化请求处理程序中的阻塞代码。在为集群购买更多服务器之前,您可以使用cluster
库将应用程序克隆到其他线程中,从而充分利用CPU核心。设计良好的Node.js应用程序应该能够处理数千个请求而没有问题。否则,您可能需要重新考虑是否Node.js是您的应用程序的最佳选择。
额外奖励:让我们听一下Node.js的发明人 - 他为什么创建了Node.js
fs.readFile
操作是异步的,因为文件I/O在后台处理,应用程序能够同时处理其他请求。 - Tim Wongcluster
库来利用另一个核心,它会启动另一个Node进程并在同一端口8080上进行监听吗? - user31986038080
端口)。请参考文档以获取更多解释。请注意,在集群应用程序时,您的应用程序应该是stateless,否则事情将变得不可预测。 - Tim Wongchild_process
。.nextTick()
以允许事件循环中的其他事情完成并稍后恢复。