Page 184 - Web性能权威指南
P. 184
• 一个慢响应就会阻塞所有后续请求;
• 并行处理请求时,服务器必须缓冲管道中的响应,从而占用服务器资源,如果有
个响应非常大,则很容易形成服务器的受攻击面;
• 响应失败可能终止 TCP 连接,从页强迫客户端重新发送对所有后续资源的请求,
导致重复处理;
• 由于可能存在中间代理,因此检测管道兼容性,确保可靠性很重要;
• 如果中间代理不支持管道,那它可能会中断连接,也可能会把所有请求串联起来。
由 于 存 在 这 些 以 及 其 他 类 似 的 问 题, 而 HTTP 1.1 标 准 中 也 未 对 此 做 出 说 明,
HTTP 管道技术的应用非常有限,虽然其优点毋庸置疑。今天,一些支持管道的浏
览器,通常都将其作为一个高级配置选项,但大多数浏览器都会禁用它。换句话
说,如果浏览器是 Web 应用的主要交付工具,那还是很难指望通过 HTTP 管道来
提升性能。
在浏览器外部使用 HTTP 管道
在完全忽略 HTTP 管道的优点之前,有必要提醒一下大家,如果你对客户端和服
务器拥有完全控制的权限,那么还是可以使用它的,并且效果非常好。事实上,
苹果 iTunes 那个案例就说明了问题,参见本章开头的“让 iTunes 用户感受到 3 倍
以上的性能增强”。如此巨大的性能提升,就来自启用持久 HTTP 连接,以及在服
务器和 iTunes 客户端内启用 HTTP 管道。
要在你自己的应用中启用管道,要注意如下事项:
• 确保 HTTP 客户端支持管道;
• 确保 HTTP 服务器支持管道;
• 应用必须处理中断的连接并恢复;
• 应用必须处理中断请求的幂等问题;
• 应用必须保护自身不受出问题的代理的影响。
实践中部署 HTTP 管道的最佳途径,就是在客户端和服务器间使用安全通道
(HTTPS)。这样,就能可靠地避免那些不理解或不支持管道的中间代理的干扰。
11.3 使用多个TCP连接
由于 HTTP 1.x 不支持多路复用,浏览器可以不假思索地在客户端排队所有 HTTP
请求,然后通过一个持久连接,一个接一个地发送这些请求。然而,这种方式在实
践中太慢。实际上,浏览器开发商没有别的办法,只能允许我们并行打开多个 TCP
HTTP 1.x | 169