使用Ack对Spray进行分块响应

时间:2014-03-19 19:02:23

标签: scala spray

我正在使用喷雾罐1.2.1。

我正在将大文件从/向存储器传输,我使用了chunked请求和chunked响应。

对于块请求,我在我的actor中使用内置的ack机制来确保在发送更多内容之前已经编写了每个块:

connection ! MessageChunk(data).withAck(ChunkSent)

connection是Spray和Akka提供的IO actor,然后我可以在发送下一个chunk之前等待ChunkSent。好。

我正在努力用chunked响应重现相同的行为。我可以发送HttpRequest,然后收到ChunkedResponseStart,然后是一堆MessageChunk,最后是ChunkedMessageEnd,但是有办法强制Spray等待< strong> me 在发送下一个MessageChunk之后发送一个ack?

编辑:为了更清楚一点:在这种情况下我使用spray-can作为客户端,我不是服务器,服务器是我之前提到的存储。

1 个答案:

答案 0 :(得分:3)

提出问题。目前,在继续阅读之前,你不能让喷雾(1.x.1)等待Acks。

然而,您可以执行的是将Tcp.SuspendReadingTcp.ResumeReading命令发送到客户端连接(块的发送方),以指示Akka IO TCP层在您超载时停止读取。请参阅此proof-of-concept尝试在SuspendReading/ResumeReading之上为接收方添加Acking(对于服务器,但对于客户端应该类似),以获取有关如何使用当前版本的喷雾构建内容的提示

这种情况显然不是最佳的,因为特别是在负载1)你需要弄清楚你是否超载2)这些消息可能会被卡在TCP连接的消息队列中,然后才能处理它们。

有两件事可以改善未来的情况:

  • 最近,Akka IO支持&#34;拉模式&#34; TCP连接只会读取一次,然后等待Tcp.ResumeReading命令(基本上是Ack)。但是,这不能用于喷雾(并且可能不会发生)。
  • 我们现在关注的Akka HTTP是流媒体支持。计划是引入一个新的API(我们在spray-can中所使用的),它可以自然地为HTTP工作流,并支持自动背压支持,而无需额外的用户代码来支持它。唉,还没有准备好。