5

在与移动客户端打交道时,在传输 HTTP 请求期间出现数秒延迟是很常见的。如果您从 prefork Apache 提供页面或服务,即使您的应用服务器逻辑在 5 毫秒内完成,子进程也将在几秒钟内为单个移动客户端提供服务。我正在寻找支持以下功能的 HTTP 服务器、平衡器或代理服务器:

  1. 请求到达代理。代理开始在 RAM 或磁盘中缓冲请求,包括标头和 POST/PUT 正文。代理不打开到后端服务器的连接。这可能是最重要的部分。

  2. 代理服务器在以下情况下停止缓冲请求:

    • 已达到大小限制(例如 4KB),或
    • 请求已被完整接收,headers 和 body
  3. 只有现在,在内存中有(部分)请求时,才打开到后端的连接并中继请求。

  4. 后端发回响应。代理服务器再次开始立即缓冲它(最大到更大的大小,比如 64KB。)

  5. 由于代理有足够大的缓冲区,后端响应在几毫秒内完全存储在代理服务器中,后端进程/线程可以自由处理更多请求。后端连接立即关闭。

  6. 代理以尽可能快或尽可能慢的速度将响应发送回移动客户端,而无需与后端连接占用资源。

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

(旁白:我会使用 nginx,但它不支持分块 POST 主体,因此无法为移动客户端提供服务。是的,便宜的 50 美元手机喜欢分块 POST……叹息)

4

5 回答 5

4

同时使用 nginx 和 Squid(客户端 - Squid - nginx - 后端)怎么样?当从后端返回数据时,Squid 确实将其从 CTE: 分块转换为设置了 Content-Length 的常规流,因此它也可以规范化 POST。

于 2008-09-24T11:36:40.363 回答
2

Fiddler是 Telerik 的免费工具,它至少可以完成您正在寻找的一些事情。

具体来说,Rules | Custom Rules...您可以在连接期间的所有点添加任意 Javascript 代码。您可以通过调用模拟一些您需要的东西sleep()

但是,我不确定这种方法能否为您提供所需的精细缓冲控制。不过,有总比没有好?

于 2008-09-18T23:39:39.217 回答
2

Nginx 可以为所欲为。您正在寻找的配置参数是

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

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

于 2008-10-01T08:03:35.330 回答
1

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

我已经对此进行了测试,发现它运行良好,但条件是它只缓冲到内存,而不是磁盘(当然,除非它交换,而且你不想要这个),所以你需要在一个盒子上运行它这是为您的工作负载适当配置的。

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

于 2010-04-15T03:08:06.297 回答
0

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

于 2008-09-19T09:37:18.407 回答