来自Akka actor

时间:2016-11-15 05:08:20

标签: scala stream akka-stream scalatra

我有一个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更糟糕?有没有更好的方法解决这个问题?

0 个答案:

没有答案