HTTP 1.1管道传输

时间:2010-07-21 10:28:37

标签: java http rfc2616 pipelining

我必须用Java实现一个HTTP客户端,根据我的需要,似乎最有效的方法是实现HTTP管道(按照RFC2616)。

顺便说一句,我想管道POST。 (另外我不是在讨论多路复用。我在谈论流水线操作,即在接收任何响应之前通过一个连接的许多请求 - 批量处理HTTP请求)

我找不到明确声明它支持流水线操作的第三方库。但我可以使用例如Apache HTTPCore建立这样一个客户,或者我必须自己构建它。

我遇到的问题是它是否是一个好主意。我没有找到任何权威的参考资料,HTTP流水线技术不仅仅是理论模型,而是由HTTP服务器正确实现。此外,所有支持流水线操作的浏览器都默认关闭此功能。

所以,我应该尝试实现这样的客户端,否则我将因服务器的实现(或代理)而遇到很多麻烦。有没有提供这些指南的参考资料?

如果不知道什么是效率的替代编程模型?单独的TCP连接?

3 个答案:

答案 0 :(得分:9)

POST不应该是流水线的

  

8.1.2.2流水线

     

支持持久性的客户端   连接可以“管道”它   请求(即发送多个请求)   无需等待每个回复)。一个   服务器必须发送其响应   那些请求的顺序相同   收到了请求。

     

假设持久性的客户端   连接和管道立即   连接建立后应该   准备重试他们的联系   如果第一次流水线尝试失败。   如果客户端进行了这样的重试,它必须   在它知道之前没有管道   连接是持久的。客户必须   也准备重新发送他们的   如果服务器关闭请求   在发送所有的连接之前连接   相应的回应。

     

客户端不应该管道请求   使用非幂等方法或   方法的非幂等序列   (见9.1.2节)。否则,一个   提前终止运输   连接可能导致不确定   结果。希望发送的客户   非幂等请求应该等待   发送该请求直到它有   收到了回复状态   先前的请求。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

答案 1 :(得分:8)

我实现了一个流水线式HTTP客户端。基本概念听起来很容易,但错误处理非常困难。性能提升是如此微不足道,以至于我们很久以前就放弃了这些概念。

在我看来,它对正常用例没有意义。当请求具有逻辑连接时,它只有一些好处。例如,您有一个3请求事务,您可以批量发送它们。但通常情况下,如果它们可以流水线化,您可以将它们组合成一个请求。

以下只是我记得的一些障碍,

  1. TCP的keepalive不保证持久连接。如果在连接中有3个管道请求,则服务器会在第一次响应后断开连接。你应该重试下两个请求。

  2. 当您有多个连接时,负载平衡也很棘手。如果没有空闲连接,您可以使用繁忙连接或创建新连接。

  3. 超时也很棘手。当一个请求超时时,您必须丢弃所有请求,因为它们必须按顺序返回。

答案 2 :(得分:-1)

流水线对http服务器几乎没有影响;他们通常以串行方式处理连接中的请求 - 读取请求,编写响应,然后读取下一个请求......

但客户端很可能通过多路复用来提高吞吐量。网站通常有多台机器有多个cpus,为什么你想自愿将你的请求限制在一行?今天它更多的是关于水平可伸缩性(并发请求)。当然,最好对它进行基准测试。