我目前正在处理一个具有以下架构的Play!项目:
控制器 -> 服务(actors)-> 模型(常规案例类)
对于每个进来的请求,我们会像这样调用服务层:
Service ? DoSomething(request, context)
我们有一组这些服务执行者,它们位于 akka 路由器后面,在应用程序初始化期间创建,并且可以根据需要进行扩展。
在服务中,我们主要进行适度的数据操作或数据库调用:
receive = {
case DoSomething(x, y) => {
...
Model.doSometing(...)
sender ! result
}
}
我开始思考我们是否应该仅使用Futures而不是使用actor来作为我们的服务。
我们没有任何需要在服务actors中修改的内部状态,每个消息进来后都会经过一个函数并输出结果。这难道不是演员模型的强大之处吗?
我们正在执行许多看起来与演员模型有很大区别的任务。
我们不进行重计算,远程调用也没有意义,因为大部分工作都是针对数据库的,并且在远程actor中进行一些数据库调用的往返操作是不必要的。
我们确实使用了reactivemongo,因此每个数据库调用都是非阻塞的。我们可以进行许多此类调用。
在我看来,去除akka并仅使用Futures可以使我们的生活更加轻松��而且我们实际上不会失去任何东西。