我正在使用喷雾罐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作为客户端,我不是服务器,服务器是我之前提到的存储。
答案 0 :(得分:3)
提出问题。目前,在继续阅读之前,你不能让喷雾(1.x.1)等待Acks。
然而,您可以执行的是将Tcp.SuspendReading
和Tcp.ResumeReading
命令发送到客户端连接(块的发送方),以指示Akka IO TCP层在您超载时停止读取。请参阅此proof-of-concept尝试在SuspendReading/ResumeReading
之上为接收方添加Acking(对于服务器,但对于客户端应该类似),以获取有关如何使用当前版本的喷雾构建内容的提示
这种情况显然不是最佳的,因为特别是在负载1)你需要弄清楚你是否超载2)这些消息可能会被卡在TCP连接的消息队列中,然后才能处理它们。
有两件事可以改善未来的情况:
Tcp.ResumeReading
命令(基本上是Ack)。但是,这不能用于喷雾(并且可能不会发生)。