在Akka actor的receive方法中处理异步调用的最佳方法

时间:2016-08-14 19:43:54

标签: multithreading scala asynchronous parallel-processing akka

我正在尝试将数据保存到数据库中。我的持久化方法是异步的。

class MyActor(persistenceFactory:PersistenceFactory) extends Actor {
  def receive: Receive = {
    case record: Record =>
      // this method is asynchronous, immediate return Future[Int]
      persistenceFactory.persist(record) 
  }
}

当应用程序在增加的负载下运行时,瓶颈在于我们内存不足或没有线程可用。

那么在Akka actor的receive方法中处理异步调用的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

这是一个很好的例子,说明你应该让一个actor创建另一个actor来处理交互。基本上流程是这样的,你可以使用FSM(有限状态机),如果它让你更容易。

  1. 父演员收到消息
  2. 父actor创建子事务actor
  3. 父母向孩子发送原始信息
  4. Child调用async方法并存储Future
  5. Child使用become()来改变其行为以等待将来的完成。有很多方法可以做到这一点,包括FSM。
  6. 查看未来的儿童schedules periodic messages to itself
  7. 如果每次接收完成后,儿童的新行为会检查未来
  8. 当Future完成后,孩子可以将结果回复给父母或原始发件人(如果父母将邮件与原始发件人进行了对比)。