喷涂分块请求限制传入数据

时间:2014-04-15 07:30:30

标签: scala memory spray chunking

我正在使用设置了incoming-auto-chunking-threshold-size的Spray 1.3,以允许传入传入请求。

当我的客户端收到一个非常大的请求时,我希望通过应用程序将其流式传输到块中的后备存储,以限制Spray应用程序使用的内存。

我发现Spray会尽快在响应中出现问题,创建配置大小的MessageChunk并将它们传递给我的应用。

如果后端存储很慢,那么这会导致Spray在本地内存中缓存大部分请求,从而破坏流式设计。

有什么方法可以让Spray阻止或限制请求流,使输入数据速率与输出数据速率匹配,以限制我的应用程序的内存使用量?

相关喷码:

HttpMessagePartParser.parseBodyWithAutoChunking方法是将请求字节流分解为MessageChunk个对象的方法。它非常贪婪,消耗尽可能多的块,然后返回NeedMoreData对象。

请求管道在NeedMoreData的{​​{3}}方法中接受RawPipelineStage,代码如下:

case Result.NeedMoreData(next) ⇒ parser = next // wait for the next packet

...所以它看起来像没有"拉"在Spray中控制分块流,框架将始终以尽可能快的速度读取请求,并将其作为MessageChunk推送到应用程序的Actors。在MessageChunk的队列中有Actor条消息后,其内存无法缓存到磁盘。

所以没有办法限制Spray用于请求的内存?

1 个答案:

答案 0 :(得分:2)

此处讨论了一种解决方法:https://github.com/spray/spray/issues/281#issuecomment-40455433

这可以在未来的喷雾释放中解决。

编辑:Spray现在是Akka HTTP,它具有“Reactive Streams”,它在仍然是异步时给TCP流提供反压:https://groups.google.com/forum/#!msg/akka-dev/PPleJEfI5sM/FbeptEYlicoJ