scala - 安排 Akka actor 的重启

标签 scala akka akka-supervision

有人知道如何创建一个在延迟后执行 Actor 重新启动的 SupervisorStrategy 吗?为了提供一些上下文,我有一个在启动时查询数据库的参与者。如果数据库连接断开,Actor 将旋转,直到达到重试次数上限。推迟重启就好了。

一个蛮力但 Not Acceptable 解决方案是执行如下操作:

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 应该支持的概念吗?是否应该将延迟或重试移至 Actor 实现本身?这似乎与“让它崩溃”的想法背道而驰。

最佳答案

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

我看到两个选择:

  • 让您的主要参与者在消息上创建查询参与者。当它因数据库中断而崩溃时,您可以停止参与者并 re-schedule一条消息来重新创建它。如果数据库操作必须先于其他操作发生,则可能会出现问题。
  • 将容错逻辑移至查询参与者内部。将数据库逻辑放在部分函数中并使用 circuit breaker处理重试。然后,您可以使用监督在需要的异常上重新启动参与者,并通过 preRestart Hook 重新安排指示执行数据库操作的消息。如果您不想重新启动,只需用 try-catch 包围断路器即可在此处重新安排消息。

关于scala - 安排 Akka actor 的重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27223720/

相关文章:

scala - 是否可以使用适用于 Everywhere 的非对象 shapeless.Poly1?

scala - 将 Akka 配置与我的配置相结合

synchronization - Akka onReceive方法是否并发执行?

uml - Akka 。如何在 UML 中说明参与者?

scala - 在 akka 2.x 中,root actor 是否由其他人监督?

scala - 当子actor在未来的onFailure内抛出异常时,Akka主管actor不会处理异常

java - Akka - 如何告诉系统在达到策略的最大重试次数后做什么?

scala - 在什么条件下推断没有什么可取的?

java - Scala:直接或通过包装器访问 Java 原语?

akka - JGroups 的替代品