【问题标题】:Schedule restart of Akka actor安排 Akka 演员的重启
【发布时间】:2014-12-01 07:39:46
【问题描述】:

是否有人知道创建一个在延迟后执行 Actor 重启的 SupervisorStrategy 的方法?为了提供一些上下文,我有一个在启动时查询数据库的演员。如果 DB 连接断开,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 实现本身?这似乎与“让它崩溃”的想法背道而驰。

【问题讨论】:

    标签: scala akka akka-supervision


    【解决方案1】:

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

    我看到两个选择:

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

    【讨论】:

    • 我决定采用第一个选项。这工作正常,但它并非没有它的局限性。主要问题是,通过重新调度 Init 消息来创建 Actor(而不是使用 Restart)会导致从头开始再次创建子 Actor(而不是 Recreated)。这意味着您失去了内置的 maxNrOfRetries 功能并自己处理。期待延迟重启作为一项功能实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2014-03-09
    • 2019-01-16
    • 2015-03-25
    • 2012-10-14
    相关资源
    最近更新 更多