2010-07-21 50 views
6

我必须在Java中实现一个HTTP客户端,并且为了我的需要,似乎最有效的方法是实现HTTP管道(根据RFC2616)。HTTP 1.1 Pipelining

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

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

我有的问题是,如果这是一个好主意。我还没有找到任何权威性的参考资料,指出HTTP流水线不仅仅是理论模型,而是由HTTP服务器正确实施。此外,所有支持流水线的浏览器都默认关闭此功能。

因此,我应该尝试实现这样一个客户端,否则由于服务器的实现(或代理服务器),我会遇到很多麻烦。有没有提供这些指导方针的参考?

如果这是一个坏主意,那么效率的替代编程模型是什么?单独的TCP连接?

+0

不是你所需要的,但是serf是一个C库,它实现了HTTP管道http://code.google.com/p/serf/虽然我不是100%确定它是否支持管道化帖子。 – Rup 2010-07-21 10:32:42

+0

谢谢,我必须在java – Cratylus 2010-07-21 10:39:52

+0

@ user384706中做到这一点从来没有尝试过农奴,但如果确实做了你想要的,而其他一切都失败了,那么你总是可以尝试JNI/JNA。 – luiscubal 2010-07-21 11:49:20

回答

8

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

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

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

  1. TCP的存活不能保证永久连接。如果您在连接中有3个请求管理,服务器会在首次响应后断开连接。你应该重试下两个请求。

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

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

+0

@ZZ编码器谢谢!在你的客户端你是否也在管理POSTs?我的情况不正常。我想要管理在呼叫中心触发操作的实时POST。您可能记得的任何信息,特别是有关服务器/代理行为的表示感谢! – Cratylus 2010-07-21 12:37:47

+0

是的。它处理POST。除了你必须记住body,如果你实现了重试逻辑,没有什么区别。 – 2010-07-21 13:41:55

+0

@ZZ编码器 - 关于1:在HTTP的情况下,你必须实现重试逻辑,并且流水线连接的重试逻辑没有太大的不同(唯一的情况是在管道中断后重试的情况下,你有等待第一个响应来查看它是否是流水线连接)。现在大多数服务器都默认启用流水线,所以除了非常糟糕的网络连接流水线丢失不应该经常发生,我猜 – 2011-09-15 03:52:31

9

POST不应流水线

8.1.2.2流水线

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

客户即假定持续 连接和连接建立后,立即管道应该 准备好在第一流水线尝试失败重试它们的连接 。 如果客户端进行了这样的重试,它在知道 连接持续之前必须为非管道。如果服务器在发送所有相应的响应之前关闭了 连接,则客户端必须准备好重新发送它们的 请求。

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

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

+4

感谢您的回复。但不应该意味着:“根据特定的行为是可接受的或甚至有用的,在特定情况下可能存在有效的理由”,这是每个rfc 2119的情况。这是这种情况之一。除非在SHOULD NOT定义中没有暗示,否则我无法进行 – Cratylus 2010-07-21 10:54:28

+0

@ user384706如果您的请求实际上是幂等的,也许您确实在做PUT? – 2011-04-15 09:23:56

+0

@ user384706,这意味着一个糟糕的服务器可能会在你管道发布时打嗝。但是的确如此,那不是你的错,但是当事情不奏效时,事情就不会奏效。不管是谁,都是无关紧要的。 – Pacerier 2012-07-18 02:51:59

-1

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

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

+1

在流水线中,至少每个定义,交互不是串行的,因为请求是分批进行的。另外,如果对同一台服务器的打开连接数量有限制? – Cratylus 2010-07-22 05:09:30

+2

使用高延迟连接(拨号)时会有所不同;当它是一个“长管”(卫星)时更是如此。它避免了多个TCP连接的开销,但保留了大部分优点。 – lxgr 2012-01-26 10:40:54