Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HTTP 1.1流水线_Java_Http_Rfc2616_Pipelining - Fatal编程技术网

Java HTTP 1.1流水线

Java HTTP 1.1流水线,java,http,rfc2616,pipelining,Java,Http,Rfc2616,Pipelining,我必须用Java实现一个HTTP客户机,根据我的需要,最有效的方法似乎是实现HTTP管道(按照) 顺便说一句,我想谈谈管道帖子。(另外,我不是说多路复用。我说的是流水线,即在接收任何响应之前通过一个连接发送多个请求—HTTP请求的批处理) 我找不到明确表示支持管道的第三方库。但我可以使用,例如,建立这样一个客户,或者如果我必须的话,自己建立它 我的问题是这是否是个好主意。我没有发现任何权威参考文献表明HTTP管道不仅仅是一个理论模型,而且是由HTTP服务器正确实现的。此外,默认情况下,所有支持管

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

顺便说一句,我想谈谈管道帖子。(另外,我不是说多路复用。我说的是流水线,即在接收任何响应之前通过一个连接发送多个请求—HTTP请求的批处理)

我找不到明确表示支持管道的第三方库。但我可以使用,例如,建立这样一个客户,或者如果我必须的话,自己建立它

我的问题是这是否是个好主意。我没有发现任何权威参考文献表明HTTP管道不仅仅是一个理论模型,而且是由HTTP服务器正确实现的。此外,默认情况下,所有支持管道的浏览器都关闭了此功能

所以,我应该尝试实现这样一个客户机,否则由于服务器的实现(或代理),我会遇到很多麻烦。是否有任何参考资料提供这些方面的指导


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

POST不应采用管道连接

8.1.2.2管道敷设

支持持久化的客户端 连接可能是其“管道” 请求(即发送多个请求 无需等待每个响应)。A. 服务器必须将其响应发送到 这些请求的顺序与 请求已收到

假定为持久的客户端 连接和管道立即关闭 建立连接后应 准备好重试他们的连接 如果第一次管道化尝试失败。 如果客户端进行了这样的重试,它必须 在它知道真相之前,管道是不行的 连接是持久的。客户必须 也要准备好重新发送他们的邮件 请求服务器是否关闭 在发送所有 相应的答复

客户端不应使用管道处理请求 使用非幂等方法或 方法的非幂等序列 (见第9.1.2节)。否则,一个 提前终止运输 连接可能导致不确定 结果。希望发送电子邮件的客户 非幂等请求应等待 发送该请求,直到完成为止 已收到对的响应状态 以前的请求


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

在我看来,它对正常用例没有意义。只有当请求具有逻辑连接时,它才有一些好处。例如,您有一个3-requests事务,您可以将它们全部成批发送。但通常,如果它们可以通过管道传输,您可以将它们合并到一个请求中

以下是我能记得的一些障碍

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

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

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


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


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

    这并不是您所需要的,但serf是一个实现HTTP管道的C库,但我不能100%确定它是否支持管道帖子。谢谢,我必须在java@user384706从未尝试过农奴,但如果真的做了你想做的事,而其他一切都失败了,然后您可以一直尝试JNI/JNA。@luiscubal谢谢您,但我的问题是,如果我甚至使用serf使用JNI/JNA,那么服务器或代理是否正确支持管道,或者我是否会遇到麻烦?例如,我的理解是ApacheHttpClient故意不支持管道。找不到权威参考或具体示例,说明它是实际用于提高性能的功能。请参阅:“支持管道的基于Java的HTTP客户端”-感谢您的回复。但根据rfc 2119,不应意味着“在特定情况下,当特定行为可接受或甚至有用时,可能存在有效的理由”。这就是其中之一。除非在“不应该”的定义中有含义,否则我无法解释undertand@user384706如果您的请求实际上是幂等的,那么您可能真的在执行PUT?@user384706,这意味着当您通过管道发布请求时,糟糕的服务器可能会打嗝。没错,这不是你的错,但当事情不起作用时,事情就不起作用了。不管是谁的错都没关系。@ZZ编码员谢谢!在你的客户中,你是否也有管道帖子?我的情况不正常。我想通过管道实时发布消息,触发呼叫中心的行动。您可能记得的任何信息,特别是关于服务器/代理行为的信息,我们将不胜感激!对它处理邮件。除了在实现重试逻辑时必须记住body之外,没有什么区别。@ZZ Coder-关于1:在HTTP的情况下,无论如何都必须实现重试逻辑,而流水线连接的重试逻辑没有太大区别(唯一的一点是,如果在管道中断后重试,您必须等待第一个响应,以查看它是否为管道连接)。而且现在大多数服务器默认启用了管道连接,因此除了非常重要的