我使用Spray.io框架实现REST服务。此类服务必须接收一些“搜索”查询,对其进行处理并将结果发送回客户端。执行搜索的代码位于单独的actor-SearchActor中,因此在收到用户的(JSON)查询后,我将该查询重新发送(使用Ask Pattern)到我的SearchActor。但是我真正不了解的是我必须如何实现spray.io route actor和我的SearchActor之间的交互。

我在这里看到了几种变体,但是哪一种更正确,为什么呢?


在启动时创建一个SearchActor实例,并将每个请求发送给该Actor
为每个请求创建SearchActor的新实例
在启动时创建SearchActor actor池,并将请求发送到该池

最佳答案

您没有被迫使用询问模式。实际上,它将为您的每个请求创建一个线程,而这可能不是您想要的。我建议您改用tell。为此,您可以为每个请求生成一个新的Actor(比线程便宜),该请求的构造函数字段之一为RequestContext。您将使用此上下文通常通过其complete方法来返回响应。

示例代码。

class RESTActor extends HttpService {
  val route = path("mypath") ~ post {
    entity(as[SearchActor.Search]) { search => ctx =>
      SearchActor(ctx) ! search
    }
  }
}

case class SearchActor(ctx: RequestContext) {
  def receive = {
    case msg: Search => //... search process
    case msg: Result => ctx.complete(msg) // sends back reply
  }
}

07-24 20:59