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

Sky*_*Sky 9 parallel-processing multithreading asynchronous scala akka

我试图将数据持久化到数据库中.我的持久化方法是异步的.

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

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

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

dre*_*res 2

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

  1. 家长演员收到消息
  2. 父 Actor 创建子事务 Actor
  3. 家长向孩子发送原始消息
  4. Child 调用异步方法并存储 Future
  5. 孩子使用become()来改变它的行为以等待未来的完成。有多种方法可以做到这一点,包括 FSM。
  6. 孩子定期向自己发送消息以检查未来
  7. Child 的新行为会检查 Future 是否在每次接收时完成
  8. 当 Future 完成时,子级可以将结果回复给父级或原始发件人(如果父级将消息转发给原始发件人)。