簡體   English   中英

在CRUD Web應用程序中使用Akka actor

[英]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專門用於寫操作,並且消息的順序處理將確保您的原子性。

需要注意的一件事是,一個actor一次處理一條消息,這在這種情況下會相當有限。 您可以使用路由器來使用actor池。

您的示例定義了存儲庫的阻塞api,這可能是您可以執行的唯一操作,具體取決於您的數據庫驅動程序。 如果可能的話,你也應該去找一個異步api,即返回Futures。 在演員那么您需要,而不是未來給發件人的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM