Meh*_*hdi 3 asynchronous nginx node.js
问题出在标题中.换句话说,如果Nginx作为node.js的事件驱动异步IO模型,它为什么不需要编写异步样式代码?我知道,Nginx 实际上并没有执行任何代码,而是将它们代理给谁.那为什么节点不这样做呢?我们在当前的Ngninx方式中遗漏了什么吗?或者,从节点获得更多东西(除了编写异步代码的痛苦)?
PS.更具体地说,Nginx + php-fpm或Nginx + wsgi + python/ruby与节点的性能或利用节点声称的计算资源有何不同?节点是否只能使用现有的FastCGI模型,是同步样式的JavaScript解释器,让webserver执行异步作业?
来自NodeJS谷歌群组的交叉发布:
好的,我会尽力回答你的问题:
Nginx是一个仅代理请求的Web服务器.现在,如果您以Nginx + php + fpm或Nginx + wsgi + ruby为例,您将拥有一个异步,即时的Web服务器,它位于同步执行的Web服务器前面.因此Nginx将尽可能多地接受()连接,并且所有连接都将排队.从Nginx到后端同步服务器的请求将是异步的.但是你的后端同步服务器也接受()不排队任何连接.它一次只能提供一个请求(考虑到你是单线程),一次多个请求(prefork/fork(慢)/多线程 - >有自己的缺点,比如线程创建时间(可以通过线程池避免但是PITA实现),上下文切换,线程死锁,连接数accept()ed永远不会大于线程数等)
想象一下,你有2条路由到你的后端服务器Nginx正在击中:
/ 404,/ login.
如果/ login路由正在执行大量I/O,并且如果对/ 404发出另一个请求,则/ 404页面的呈现将取决于/ login的请求的完成(因为该进程被阻止).所以基本上对任何请求的响应将取决于花费最长时间进行I/O的请求.因此,即使Nginx是异步的,并且它的任何请求的响应时间都将完全取决于那个花费最长时间才能完成的请求(罪魁祸首:同步后端服务器).
现在,如果你以NodeJS为例,一切都是异步和事件.无论是文件/网络I/O等,都没有阻止这个过程.因此,采用前面的示例,即使/ login路由正在执行大量I/O,也会立即呈现所有异步和/ 404页面.
我的解释非常简陋.但我认为它应该让你更清晰.
| 归档时间: |
|
| 查看次数: |
1640 次 |
| 最近记录: |