http chunked, tcp flow control 和 playframework 结合

Posted

技术标签:

【中文标题】http chunked, tcp flow control 和 playframework 结合【英文标题】:http chunked, tcp flow control and playframework combined 【发布时间】:2012-12-11 00:22:41 【问题描述】:

因此,我们可能会通过 http 服务器将大量数据从 http 服务器流式传输到客户端。因此,我想到了 http 分块 + tcp 流量控制。通常,要成为这样的中间人,我们中间的人会从下游异步套接字读取并尝试向上游写入,如果写入是异步的,我们将需要回调。在调用写回调之前,我们不会再次从下游套接字读取数据,这将导致 tcp 流控制在 nic 缓冲区填满后自动生效(至少我之前已经正确地看到过这种情况)。

所以我想我真的有两个问题

    任何版本的 playframework 是否有写入回调,以便我们知道写入何时正式发送,以便我们可以再次继续处理。 有谁知道调用 hasData 的 java http 客户端,我必须调用读取下一个块,直到我停止调用典型的 hasHeaded(Headers h)、hasStatus(HttpStatus)、hasChunk(HttpChunk chunk)

那么 #2 会是理想的,但任何接近都会很好。

另外,如果我在任何方面有错误,请随时纠正我。

谢谢, 院长

【问题讨论】:

+1 表示问题。你有进步吗? 实际上有很多。我刚刚完成了一个在 mina 和 netta 之前完成的 sourceforge 项目的移植,以便在 github.com/deanhiller/channelmanager2 进行流控制,我将把它连接到异步 http 客户端(看起来还不错),并且在游戏中,我发现了如何破解所以 writeChunk接受回调。 channelmanager2 给了我们一个 DataChunk 并停止读取,直到我们调用 DataChunk.setProcessed(如果我们调用它的速度不够快,tcp 流控制就会启动;))。我们将在我们给 playframeworks writeChunk 方法的回调中调用 setProcessed,我已经看到如何修改 play 以使其工作。 【参考方案1】:

我应该添加更多信息,如果我记得,我会更新(当我通过电子邮件收到通知时,你可以通过发表评论来提醒我)。

我们对此进行了调查,而且工作量并不大。 netty 中有一个 http 类,我们必须复制和修改 play 以添加我们修改的类,我们还必须修改 play 以具有 writeChunk(chunk, callback) 以便在写入时将回调提供给 netty 调用完成了。

在下游,我们移植了 channelmanager(我在 pre-netty 和 pre-mina 中编写了一些东西,没有管道和所有复杂性,但看起来就像 java 的 Sockets,只是你注册了侦听器以听到传入的数据)。这个新的通道管理器只是不断地为您提供具有 ByteBuffer 的 DataChunk,直到您调用 Datachunk.setProcessed,我们实际上停止从该套接字读取,从而允许 tcp 流控制启动。

我们计划利用 netty 的解析器。尽管 netty、grizzly 和 mina 都犯了将解析器与框架绑定得太紧的错误 :( :(....当它认为解析器是不将其绑定到框架时的第一件事....哦,好吧。也就是说,所有 3 人都对我如何利用他们的解析器提供了一些很好的建议,所以我不必重写那部分....正确地执行 tcp 流已经是一个巨大的痛苦,并且花了我 2 天的时间来测试中断/修复频道管理器。

一旦一切就绪并连接到 async-http-client 下,它可以有不同的 nio 库,然后我可以轻松地接受一大块数据,当我最终 writeChunk(newChunk, callback) 时,我可以传入调用 DataChunk.setProcessed 以允许下游再次继续的回调。如果您聚合流,或者如果您只是想在一个非常讨厌的客户面前保持稳健,他向您发送一些东西但让他的 nic 填满,这将非常有用。

事实上,这可能是对网络服务器的一种新型攻击,它在许多网络服务器上都有效,但它根本不会影响我们的服务器;)。您可以编写一个客户端来写入,然后不从套接字读取,让 nic 填满并继续写入服务器……最终,随着 tcp 流控制启动,许多服务器将挂起写出……我应该在 tomcat 和旧的 playframework 上尝试一下。

【讨论】:

所以现在我将重新使用 netty 解析器,因为在没有来自这篇文章 ***.com/questions/13830322/… 的 netty nio 的情况下测试它的工作,并且使用 channelmanager、netty 解析和 async-http-client 应该能够进行流量控制....希望 asynch-http-client 接受我的拉取请求。

以上是关于http chunked, tcp flow control 和 playframework 结合的主要内容,如果未能解决你的问题,请参考以下文章

HTTP协议的chunked编码

TCP/IP 系列之 TCP 流控与拥塞控制

python 通过python发送chunked http请求

libcurl遇到http的chunked问题

模拟http请求 带 chunked解析办法二

HTTP协议之chunk编码(分块传输编码)