是否有对请求/响应缓冲和延迟连接具有显式可配置支持的HTTP代理?

时间:2020-03-06 14:23:38  来源:igfitidea点击:

与移动客户端打交道时,在HTTP请求的传输过程中通常会有几秒钟的延迟。如果我们要从Apache的预分支中提供页面或者服务,则即使应用程序服务器逻辑在5毫秒内完成,子进程也将被捆绑数秒钟以为单个移动客户端提供服务。我正在寻找支持以下内容的HTTP服务器,平衡器或者代理服务器:

  • 请求到达代理。代理开始在请求的RAM或者磁盘中缓冲,包括标头和POST / PUT主体。代理不会打开与后端服务器的连接。这可能是最重要的部分。
  • 该请求已完全收到,标头和正文
  • 直到现在,请求(在内存中)(一部分)才打开到后端的连接,并转发请求。
  • 后端发回响应。再次,代理服务器立即开始对其进行缓冲(最大大小为64KB。)
  • 由于代理具有足够大的缓冲区,因此后端响应可以在几毫秒内完全存储在代理服务器中,并且后端进程/线程可以自由处理更多请求。后端连接立即关闭。
  • 代理将响应尽快或者尽可能慢地发送回移动客户端,而无需与后端连接来占用资源。

我相当确定我们可以使用Squid进行4-6,并且nginx似乎支持1-3(并且在这方面看起来相当独特)。我的问题是:是否有任何代理服务器能够移入这些缓冲功能,并且不能打开连接直到准备就绪功能?也许只有一点Apache config-fu使这种缓冲行为变得微不足道?他们中有谁不是像Squid这样的恐龙并且支持精益单进程,异步,基于事件的执行模型?

(旁白:我会使用Nginx,但它不支持分块的POST正文,从而使其无法为移动客户端提供服务。是的,便宜的50美元手机喜欢分块的POST ......)

解决方案

Fiddler是Telerik的免费工具,至少可以满足需求。

具体来说,请转到"规则|自定义规则...`,我们可以在连接期间的所有位置添加任意Javascript代码。我们可以通过调用sleep()来模拟一些我们需要的东西。

但是,我不确定此方法是否可以为我们提供所需的精细缓冲控制。不过,有什么总比没有好?

不幸的是,我不知道有一个现成的解决方案。在最坏的情况下,考虑使用Java NIO自己开发它-花费不超过一周的时间。

如何同时使用nginx和Squid(客户端Squid nginx后端)呢?从后端返回数据时,Squid会将其从C-T-E:转换为分块为具有Content-Length设置的常规流,因此也许它也可以标准化POST。

Nginx可以做我们想要的一切。我们正在寻找的配置参数是

http://wiki.codemongers.com/NginxHttpCoreModule#client_body_buffer_size

http://wiki.codemongers.com/NginxHttpProxyModule#proxy_buffer_size

Squid 2.7可以通过补丁支持1-3:

  • http://www.squid-cache.org/Versions/v2/HEAD/changesets/12402.patch

我已经对其进行了测试,并发现它可以很好地工作,但前提条件是它仅缓冲到内存,而不缓冲到磁盘(除非交换,当然,并且我们不希望这样做),因此需要在一个盒子上运行已为工作量提供了适当的资源。

对于大多数服务器和中介来说,成块的POST是一个问题。我们确定需要支持吗?通常,客户在收到411时应重试该请求。