我正在实现一个快速的‘ve应用程序,在阅读了fastcgi规范之后,我发现了一个叫做“请求多路复用”的特性。这让我想起了Adobe RTMP多路复用的时代,协议是专有的,是封闭的。
据我所知,多路复用可以减少创建到FCGI客户端的新连接的开销,有效地交织请求块,同时启用连接的“保持活动”模型。后者允许在单个连接上发送多个请求。
第一个问题是我做对了吗?
下一个是--经过一些谷歌搜索,我发现没有实现FCGI多路复用的服务器,我首先对“流行”的服务器感兴趣,我的意思是nginx和lighttpd。我甚至发现了一些关于弃用FCGI请求多路复用的讨论。
所以问题是--有没有支持这个特性的服务器?
发布于 2018-10-12 11:32:41
问:多路复用可以减少创建到FCGI客户端的新连接的开销,从而有效地交织请求块
答:是真的。但keep-alive也在减少新的连接。
问:同时启用"keep-alive“模型连接
答: keep-alive不需要复用。
问:后者允许在单个连接上发送多个请求
答: keep-alive允许一个接一个的请求。多路复用允许并行处理多个请求。
目前还没有广泛使用的支持多路复用的支持FastCGI的web服务器。但nginx支持FastCGI keep-alive。
FastCGI多路复用通常不是一个好主意,因为FastCGI不支持流控制。这意味着:如果FastCGI后端发送数据,但是http客户端不能足够快地接收数据,则web服务器必须保存所有这些数据,直到它们可以发送到客户端。
当不使用多路复用时,如果http客户端太慢,web服务器就不能从fastcgi后端读取数据,从而有效地积压fastcgi后端。当使用多路复用时,web服务器需要从fastcgi后端读取所有数据,即使其中一个客户端接收数据的速度不够快。
发布于 2018-11-10 04:55:07
尝试更准确地陈述上面的答案(并更正某些部分)……
FCGI多路复用允许减少创建到
客户端的新连接的开销,从而有效地交织请求块
与keep-alive相反,它极大地减少了新的连接,特别是在高负载服务器或微服务(大量微请求)的使用中。此外,它几乎是在网络平衡的情况下需要的(因此不能再使用unix套接字,并且连接建立过程获得越来越多的优先级)。
,同时启用“保活”模型到连接
虽然keep-alive不需要多路复用,但多路复用几乎需要keep-alive (否则意义不大)。
我发现没有服务器实现FCGI多路复用
很少有服务器支持开箱即用的多路复用,但是...
我已经看到了其他开发者的几个模块,我有自己的nginx的fcgi-module (作为替代),它支持FastCGI多路复用请求。它可以在实践中显示出真正的性能提升,特别是在上游通过网络连接的情况下。如果有人需要它,我会尽量抽出时间,在github等网站上提供。
FastCGI多路复用通常不是一个好主意,因为FastCGI不支持流控制。这意味着:如果FastCGI后端发送数据,但是http客户端不能足够快地接收数据,则web服务器必须保存所有这些数据,直到它们可以发送到客户端。
这不是真的。通常,FastCGI处理程序是完全异步的,工作线程池与传送工作进程分离,等等。因此,每个块都会获得一个请求id,因此,如果两个或更多上游工作进程同时写入单个连接,nginx将获得的块会更小。这就是单一的缺点。至于“web服务器必须保存所有这些数据”,它在任何情况下都会这样做(无论是否使用多路复用),因为否则,如果有太多挂起的数据可供响应,可能会出现内存不足的情况。因此,要么后端应该产生更少的数据(或受挫),要么web服务器应该尽快接收数据并将其传输到客户端或将其保存到某个临时存储中(例如,如果挂起的数据大小超过fastcgi_buffer_size和fastcgi_buffers指令配置的值,nginx就会这样做)。
当使用多路复用时,web服务器需要从
后端读取所有数据,即使其中一个客户端接收数据的速度不够快。
这也是假的。web服务器必须只读取响应的单个块到最后,并且好的工作者池具有“智能”处理,因此自动将块尽快发送到web服务器(如果它可用的话),因此如果多个内容提供商写入相同真实连接的所谓“反射”通道,则一旦响应数据可用,挂起的分组将被分离并从nginx接收块。因此,几乎只有连接的吞吐量是至关重要的,而客户端接收数据的速度有多快根本无关紧要。而且,多路复用大大节省了连接建立的时间,因此减少了挂起请求的数量以及公共请求执行时间(事务率)。
发布于 2011-10-27 14:25:38
我不知道是否有一些服务器实现了FASTCGI多路复用(我相信您是正确理解的,但详细信息在FASTCTI协议规范中),我不会费心的。
你很可能会通过一个existing FASTCGI library来使用FASTCGI (例如,如果你用Ocaml编写代码,那就是Ocamlnet )。如果这个库能做到这一点,它就会进行多路复用。从您(该库用户)的角度来看,您不应该真正关心,除非您自己编写这样的库。
如果FASTCGI多路复用困扰您,您可以使用SCGI协议,该协议提供类似的功能,但更简单,效率稍低,并且不是多路复用。
https://stackoverflow.com/questions/7912322
复制相似问题