加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在CRUD Web应用程序中使用Akka演员

发布时间:2020-12-16 09:43:36 所属栏目:安全 来源:网络整理
导读:我正在使用Scala编写的Web应用程序,使用Play!框架和Akka。代码的组织方式基本如下:播放控制器向Akka演员发送消息。反过来,演员与持久层交谈,提取数据库访问。在应用程序中使用这些组件的典型示例: class OrderController(orderActor: ActorRef) extend
我正在使用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。唯一相关的区别是使用actors和异步调用。

现在,我对演员的概念很新,所以我还没有得到它。但是,从我所看到的,这不是演员如何被使用。但是请注意,在某些情况下(例如,在插入订单时发送电子邮件),我们确实需要真正的异步消息传递。

所以我的问题是:以这种方式使用演员是个好主意?在Scala中编写CRUD应用程序的替代方法是什么,利用Futures和Akka的其他并发功能?

解决方法

虽然基于actor的并发性不适合开箱即用的事务操作,但是如果您使用持久层玩得很好,则不会阻止您使用actors。如果你可以保证插入(写)是原子的,那么你可以安全地拥有一个演员池。通常数据库有线程安全读取,所以找到应该也按预期工作。除此之外,如果插入不是线程安全的,您可以使用一个单独的WriteActor专用于写操作,并且消息的顺序处理将确保您的原子性。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读