【问题标题】:Akka escalate supervision strategy stops childrenAkka 升级监督策略阻止孩子
【发布时间】:2019-03-12 10:04:25
【问题描述】:

我正在试验OneForOneStrategy 策略,它升级失败。我的 Actor 结构是:Supervisor -> Slave,其中 Slave 是 Supervisor 的子节点。

Slave 响应 2 条消息 - “fail”(抛出异常)和“work”(进行一些日志记录)

我的第一个问题是,如果 Slave 失败,那么 Supervisor 会重新启动(由于升级策略,“Guardian”已经重新启动它),但是 Slave 被停止并没有重新启动。

我想这种默认行为是停止子进程而不是重新启动它们是有原因的。你能解释一下这个设计决定吗?在哪些情况下,这是比重启更好的方法?

我的问题是 Slave 的收件箱看起来像这样:“work”、“fail”、“work”。

失败后,最后一个“工作”消息以死信结束,因为从站被停止和启动(通过初始化主管)。 解决方案是覆盖preRestart 方法:

@Override
public void preRestart(Throwable reason, Optional<Object> message) throws Exception {
    postStop();
}

这解决了问题并导致子项重新启动。我还必须在 Supervisor 中更改 Slave 的初始化。

【问题讨论】:

    标签: akka


    【解决方案1】:

    孩子停止的原因是他们被视为演员内部状态的一部分,当演员重新启动时,可以说是从头开始。

    正如您所指出的,您可以通过覆盖 preRestart 来选择退出。

    我们正在重新审视 Akka Typed 的这种默认行为,它是下一代 Akka Actor API,如果您有兴趣,可以在这里查看一些讨论:https://github.com/akka/akka/issues/25556

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      相关资源
      最近更新 更多