在与移动客户端打交道时,在传输 HTTP 请求期间出现数秒延迟是很常见的。如果您从 prefork Apache 提供页面或服务,即使您的应用服务器逻辑在 5 毫秒内完成,子进程也将在几秒钟内为单个移动客户端提供服务。我正在寻找支持以下功能的 HTTP 服务器、平衡器或代理服务器:
请求到达代理。代理开始在 RAM 或磁盘中缓冲请求,包括标头和 POST/PUT 正文。代理不打开到后端服务器的连接。这可能是最重要的部分。
代理服务器在以下情况下停止缓冲请求:
- 已达到大小限制(例如 4KB),或
- 请求已被完整接收,headers 和 body
只有现在,在内存中有(部分)请求时,才打开到后端的连接并中继请求。
后端发回响应。代理服务器再次开始立即缓冲它(最大到更大的大小,比如 64KB。)
由于代理有足够大的缓冲区,后端响应在几毫秒内完全存储在代理服务器中,后端进程/线程可以自由处理更多请求。后端连接立即关闭。
代理以尽可能快或尽可能慢的速度将响应发送回移动客户端,而无需与后端连接占用资源。
我相当肯定你可以用 Squid 做 4-6,而 nginx 似乎支持 1-3(在这方面看起来相当独特)。我的问题是:是否有任何代理服务器可以理解这些缓冲和不打开连接直到准备好功能?也许只有一点 Apache config-fu 让这种缓冲行为变得微不足道?他们中的任何一个认为它不是像 Squid 那样的恐龙并且支持精益的单进程、异步、基于事件的执行模型吗?
(旁白:我会使用 nginx,但它不支持分块 POST 主体,因此无法为移动客户端提供服务。是的,便宜的 50 美元手机喜欢分块 POST……叹息)