我使用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
}
}