在CRUD Web应用程序中使用Akka actors
我正在使用Play!编写一个用Scala编写的Web应用程序!框架和Akka。代码基本上是这样组织的:播放控制器向Akka演员发送消息。演员反过来与一个持久层交谈,该层抽象数据库访问。在应用这些部件的使用的一个典型的例子:在CRUD Web应用程序中使用Akka actors
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模式,就像你会在其他语言和框架看。查询会传递到下面的图层,并且当应用程序从数据库中获取结果时,该结果会返回到用户界面。唯一相关的区别是使用actor和异步调用。
现在,我对演员的概念很陌生,所以我还没有完全理解它。但是,从我读过的,这不是演员应该如何使用。但是,请注意,在某些情况下(例如,在插入订单时发送电子邮件),我们确实需要真正的异步消息传递。
所以,我的问题是:以这种方式使用演员是一个好主意吗?利用Futures和Akka的其他并发功能,在Scala中编写CRUD应用程序有哪些选择?
回答:
尽管基于角色的并发与开箱即用的事务操作不相符,但如果与持久层良好地配合,则不会阻止您使用actor。如果你可以保证插入(写)是原子,那么你可以安全地让一群演员为你做。通常数据库有一个线程安全读取所以找到也应该按预期工作。除此之外,如果插入不是线程安全的,则可以将一个WriteActor专门用于写入操作,并且顺序处理消息将确保您的原子性。
回答:
有一点需要注意的是,一个角色一次处理一条消息,在这种情况下这将是相当有限的。您可以使用routers来使用一组演员。
您的示例根据数据库驱动程序定义存储库的阻止API,这可能是唯一可以执行的操作。如果可能的话,你也应该在那里寻找一个异步API,例如返回期货。在演员中,您将接着发送未来的结果pipe。
以上是 在CRUD Web应用程序中使用Akka actors 的全部内容, 来源链接: utcz.com/qa/258788.html