我正在使用设置了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用于请求的内存?
答案 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