我正在开发一个用 Scala 编写的 Web 应用程序,使用 Play!框架和 Akka。代码基本上是这样组织的:播放控制器向 Akka 演员发送消息。参与者依次与抽象数据库访问的持久层对话。在应用程序中使用这些组件的典型示例:
class OrderController(orderActor: ActorRef) extends Controller {
def showOrders(customerId: Long) = {
implicit request => Async {
val futureOrders = orderActor ? FindOrdersByCustomerId(id)
// Handle the result, showing the orders list to the user or showing an error message.
}
}
}
object OrderActor extends Actor {
def receive = {
case FindOrdersByCustomerId(id) =>
sender ! OrderRepository.findByCustomerId(id)
case InsertOrder(order) =>
sender ! OrderRepository.insert(order)
//Trigger some notification, like sending an email. Maybe calling another actor.
}
}
object OrderRepository {
def findByCustomerId(id: Long): Try[List[Order]] = ???
def insert(order: Order): Try[Long] = ???
}
如您所见,这是基本的 CRUD 模式,与您在其他语言和框架中看到的非常相似。查询被传递到下面的层,当应用程序从数据库中获取结果时,该结果会返回,直到它到达 UI。唯一相关的区别是参与者和异步调用的使用。
现在,我对演员的概念很陌生,所以我还不太明白。但是,根据我所读到的,这不是演员应该被使用的方式。但是请注意,在某些情况下(例如,在插入订单时发送电子邮件)我们确实需要真正的异步消息传递。
所以,我的问题是:以这种方式使用演员是个好主意吗?利用 Futures 和 Akka 的其他并发功能,在 Scala 中编写 CRUD 应用程序的替代方案是什么?