gpt4 book ai didi

node.js - 作为事件驱动的服务器,为什么 node.js 需要异步代码而 Nginx 不需要?

转载 作者:搜寻专家 更新时间:2023-10-31 23:32:02 25 4
gpt4 key购买 nike

问题在标题中。换句话说,如果 Nginx 与 node.js 的事件驱动异步 IO 模型相同,为什么它不需要编写异步样式代码?我知道,Nginx 实际上执行任何代码,而是将它们代理给可以执行的人。那为什么 Node 不这样做呢?我们是否遗漏了当前 Ngninx 方式中的任何内容?或者,从 Node 中获得更多(除了编写异步代码的痛苦)?

附言。更具体地说,Nginx+php-fpm 或 Nginx+wsgi+python/ruby 与单独的 Node 在性能或利用 Node 声明的计算资源方面有何不同? Node 不能只使用现有的 FastCGI 模型,成为一个同步风格的 JavaScript 解释器,让网络服务器完成它的异步工作吗?

最佳答案

从 NodeJS 谷歌群组交叉发布:

好的,我会尽力回答你的问题:

Nginx 是一个只代理请求的网络服务器。现在,如果您以 Nginx+php+fpm 或 Nginx+wsgi+ruby 为例,您将拥有一个异步的事件 Web 服务器,它位于同步执行的 Web 服务器前面。所以 Nginx 将 accept() 尽可能多的连接,并且所有连接都会排队。从 Nginx 到后端同步服务器的请求将是异步的。但是你的后端同步服务器也确实 accept() 没有排队任何连接。它一次只能服务一个请求(考虑到你是单线程的)和一次多个请求(prefork/fork(慢)/多线程 -> 有它自己的缺点,比如线程创建时间(可以通过线程池避免,但是PITA 实现)、上下文切换、线程死锁、接受()的连接数永远不能大于线程数等)

假设您有 2 条路由到 Nginx 正在访问的后端服务器:

/404,/登录。

如果/login 路由正在执行大量 I/O,并且如果向/404 发出另一个请求,则/404 页面的呈现将取决于/login 请求的完成(因为进程被阻塞)。所以基本上对任何请求的响应将取决于花费最长时间进行 I/O 的请求。因此,即使 Nginx 是异步和事件化的,它对任何请求的响应时间也将完全取决于完成时间最长的请求(罪魁祸首:同步后端服务器)。

现在,如果您以 NodeJS 为例,一切都是异步的和事件的。无论是文件/网络 I/O 等。所以没有什么能阻止这个过程。因此,以前面的示例为例,即使/login 路由正在执行大量 I/O,它的所有异步操作和/404 页面都会立即呈现。

我的解释很简陋。但我认为它应该让你更清楚。

关于node.js - 作为事件驱动的服务器,为什么 node.js 需要异步代码而 Nginx 不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11966292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com