[英]Using Akka actors in a CRUD web application
我正在使用Play編寫一個用Scala編寫的Web應用程序! 框架和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。 唯一相關的區別是使用actor和異步調用。
現在,我對演員的概念很新,所以我還沒有完全理解。 但是,從我讀過的內容來看,並不是演員應該如何使用。 但請注意,在某些情況下(例如,在插入訂單時發送電子郵件),我們確實需要真正的異步消息傳遞。
所以,我的問題是:以這種方式使用演員是一個好主意嗎? 在Scala中編寫CRUD應用程序有哪些替代方案,利用Futures和Akka的其他並發功能?
盡管基於actor的並發性並不適合開箱即用的事務操作,但是如果你很好地使用持久層,這並不能阻止你使用這種方式。 如果您可以保證插入 (寫入)是原子的,那么您可以安全地讓一個演員池為您完成。 通常,數據庫具有線程安全讀取,因此查找也應該按預期工作。 除此之外,如果插入不是線程安全的,您可以只使用一個WriteActor專門用於寫操作,並且消息的順序處理將確保您的原子性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.