如何在Actor的receive方法中使用Future来处理容错?

时间:2013-12-30 22:46:51

标签: scala akka actor future

在使用Future时我还需要做什么来支持容错,如下面的代码所示?

...

override def receive = {

   case email: Email => Future {

      // Suppose here I got an exception. Without "Future", supervisor strategy 
      // works well restarting the actor   
      throw new MailException("ops!")

   }

}

主管策略:

...
withSupervisorStrategy(
   OneForOneStrategy(

 // Max number of retries
 maxNrOfRetries = retries,
 // Time Window
 withinTimeRange = timeRange) {

 case ex: MailException => {
   Restart
 }

}))

1 个答案:

答案 0 :(得分:4)

它可能会有点复杂,因为在Future完成时,Actor可能已经处理了其他消息。

在这种情况下,未来甚至意味着失败?如果这意味着Actor已损坏且应该重新启动,那么在过渡期间处理的消息的有效性是什么?

这一切都取决于上下文,以及你的Actor + Future究竟发生了什么,但它几乎归结为两种选择:

  1. Actor仍然有效且不需要重新启动,但您仍需要为将来的结果执行一些明确的错误处理/恢复

  2. 演员无效。我在这里假设所有临时消息也将在期货中处理,这也将失败。当一个未来失败时,您可以向演员发送一条消息,该消息将导致它抛出异常以供您的主管策略选择...

    ......当然,选择#2会让事情变得很复杂。你必须考虑多个期货连续失败。你如何防止多次重启消息?如果未来在重新启动之前启动但未在之后失败,您如何应对?

  3. TL; DR - 在像这样的演员中使用期货与监督很好地互动。不要在未来做可能需要重启的事情;尝试使用池化的actor或嵌套的worker actor。