安排重启Akka演员

时间:2014-12-01 07:39:47

标签: scala akka delay restart supervisor

是否有人知道如何创建一个在延迟后执行Actor重启的SupervisorStrategy?为了提供一些上下文,我有一个在启动时查询数据库的actor。如果数据库连接关闭,则Actor将旋转直到它达到最大重试次数。推迟重启会很好。

蛮力但不可接受的解决方案是执行以下操作:

override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute)    
  {
    case initEx: ActorInitializationException => {
      Thread.sleep(1000)
      Restart
    }
    case t =>
      super.supervisorStrategy.decider.applyOrElse(t, (_: Any) => Escalate)
  }

然而,这对我来说似乎站不住脚,因为我想避免任何阻止代码。

这不是一个应该由演员支持的概念吗?延迟或重试是否应该移入Actor实现本身?这似乎与“让它崩溃”的想法背道而驰。

1 个答案:

答案 0 :(得分:2)

尚未实施重启延迟。 Thread.sleep在性能方面是不可能的。

我看到两个选择:

  • 让主要演员在消息上创建查询actor。当由于数据库中断而爆炸时,您可以停止演员和re-schedule消息以重新创建它。如果数据库操作必须先于其他任何操作,那么可能会出现问题。
  • 在查询actor中移动容错逻辑。将数据库逻辑放在部分函数中,并使用circuit breaker来处理重试。然后,您可以使用监督在所需的异常上重新启动actor,并通过preRestart钩子重新调度指示执行数据库操作的消息。如果您不想重新启动,只需使用try-catch围绕您的断路器,以便在此处重新安排消息。