Akka演员在接收方法内处理异步调用的最佳方法

9

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

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方法内处理异步调用的最佳方式是什么?


persist是做什么的?它是否接受隐式的ExecutionContext - Yuval Itzchakov
不,它有自己的ExecutionContext。 - Sky
它如何创建一个 ExecutionContext?你能展示一下代码吗? - Yuval Itzchakov
让我们以Slick插入方法为例。 - Sky
1个回答

2
这是一个很好的例子,说明何时应该让一个演员创建另一个演员来处理交互。基本上流程如下,如果使用有限状态机(FSM)会更容易:
1. 父演员接收消息 2. 父演员创建子事务演员 3. 父演员向子演员发送原始消息 4. 子演员调用异步方法并存储 Future 5. 子演员使用 become() 改变其行为以等待未来完成。有许多方法可以做到这一点,包括 FSM。 6. 子演员定期向自己发送消息以检查未来 7. 子演员的新行为在每次接收时检查未来是否完成 8. 当未来完成时,子演员可以将结果回复给父级或原始发件人(如果父级使用原始发件人转发了消息)。

我们可以在未来对象上注册一个onComplete回调函数,将结果发送给子Actor。 - Peter Schmitz
当然,我在考虑Java而不是Scala Future或Java 8 Completable Future。但回调的缺点是,你仍然希望子进程发送超时消息给自己,以防未来执行器出现问题。 - dres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接