Scala 喷射分块请求阻止传入数据

Scala 喷射分块请求阻止传入数据,scala,memory,spray,chunking,Scala,Memory,Spray,Chunking,我正在使用Spray 1.3,设置了传入自动分块阈值大小以允许传入请求的流式传输 当一个非常大的请求从我的客户端传入时,我想通过应用程序将其流式传输,然后以块的形式输出到备份存储,以限制Spray应用程序使用的内存 我发现Spray会以最快的速度响应,创建配置大小的MessageChunks并将它们传递给我的应用程序 如果后端存储速度较慢,则会导致在本地内存中喷射缓存大部分请求,从而破坏流式设计 有没有办法阻止或限制请求流,使输入数据速率与输出数据速率相匹配,从而限制我的应用程序的内存使用 相关

我正在使用Spray 1.3,设置了
传入自动分块阈值大小
以允许传入请求的流式传输

当一个非常大的请求从我的客户端传入时,我想通过应用程序将其流式传输,然后以块的形式输出到备份存储,以限制Spray应用程序使用的内存

我发现Spray会以最快的速度响应,创建配置大小的
MessageChunk
s并将它们传递给我的应用程序

如果后端存储速度较慢,则会导致在本地内存中喷射缓存大部分请求,从而破坏流式设计

有没有办法阻止或限制请求流,使输入数据速率与输出数据速率相匹配,从而限制我的应用程序的内存使用

相关喷涂代码: 该方法将请求字节流分解为
MessageChunk
对象。它贪婪地这样做,消耗尽可能多的块,然后返回一个
NeedMoreData
对象

请求管道以
RawPipelineStage
的方法接受
NeedMoreData
,代码如下:

case Result.NeedMoreData(next) ⇒ parser = next // wait for the next packet
。。。因此,在我看来,Spray中没有对分块流的“拉”控制,框架总是会尽可能快地读入请求,并将其作为
MessageChunk
s推送到应用程序的参与者。一旦
MessageChunk
消息在my
Actor
的队列中,其内存就无法缓存到磁盘


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

这里讨论了一个解决方法:

这可能会在未来的喷涂版本中解决

编辑:Spray现在是Akka HTTP,它具有“反应流”,在保持异步的同时向TCP流返回压力: