我有一个Scalatra应用程序,其中ScalatraServlet将负责解码响应,执行身份验证等,然后将任务发送给actor进行处理,请考虑:
// class has FutureSupport
get("/status/:id") {
val id = params("id")
// (other validation tasks)
myActor ? StatusRequest(id)
}
这将计算myActor中的响应,一旦答案出现,它将作为批处理发送给客户端。
现在在某些情况下我想发送流式响应,例如当整个响应不适合内存时。我可以执行此操作的一种方法如下:
get("/file/:id") {
val id = params("id")
// (other validation tasks)
myActor ? FileRequest(id, response.outputStream)
// myActor writes *directly to the stream* and sends back
// to the sender only a Unit response when done
}
现在我想知道这是否是理智的事情。我想在Akka中很多东西不应该在演员之间传递,特别是可变状态。上面的方法对我来说很好,但是有什么问题吗?我想到的另一件事是使用Akka Streams:
get("/file/:id") {
val id = params("id")
// (other validation tasks)
val stream = response.outputStream // don't close over `response`
val sink = StreamConverters.fromOutputStream(stream)
myActor ? FileRequest(id, sink)
// myActor writes to the sink and sends back
// to the sender only a Unit response when done
}
这是一种更好的方法吗?我可以向演员发送接收器,还是比发送OutputStream更糟糕?有没有更好的方法解决这个问题?