如何在 Akka 中监督 actor 并处理异常

Posted

技术标签:

【中文标题】如何在 Akka 中监督 actor 并处理异常【英文标题】:How to supervise actors in Akka and handle exceptions 【发布时间】:2021-11-24 19:46:18 【问题描述】:

我正在尝试改进系统中参与者的错误处理。有时,在处理数据时出现问题,我需要停止并重新启动actor,并记录有关此故障的一些信息。

我有一个主管,有 5 个演员为它工作。所以我需要能够监督他们所有人。我找到了这个链接:

https://doc.akka.io/docs/akka/current/typed/fault-tolerance.html

关于这个,但我认为在哪里实现代码并不是很清楚:

Behaviors.supervise(behavior).onFailure[IllegalStateException](SupervisorStrategy.restart)

这段代码到底应该去哪里?

谢谢

【问题讨论】:

目前还不清楚您是在询问经典 API 还是类型化 API(如果是类型化 API,我建议添加 akka-typed 标签(可能替换 actor 标签)。经典 API 中的监督(例如,您有 extends Actor 的代码)非常不同,并记录在 doc.akka.io/docs/akka/current/supervision-classic.html 嗨,是的,对不起,你是对的。我正在使用经典演员。我试图找到一些似乎适用于我的场景的东西。每个主管有 5 个子角色,如果其中一个角色失败,我需要在错误级别记录它,并检索该角色正在处理的数据。 @LeviRamsey 【参考方案1】:

您可以将此supervisor 视为另一个behavioiur,它将您的behaviour 包裹在其中。

假设您想要关注 HelloWorld 演员。

object HelloWorldActor 

  sealed trait Command
  case class HelloCommand(name: String) extends Command

  def apply(): Behavior[Command] =
    Behaviors.receiveMessage[Command]  
      case msg: HelloCommand =>
        println(s"Hello $msg.name")
        Behaviors.same
    


现在,您可以用“主管”“包装”这种“行为”

object SupervisedHelloWorldActor 

  sealed trait Command
  case class HelloCommand(name: String) extends Command

  def apply(): Behavior[Command] =
    Behaviors.supervise(
      Behaviors.receiveMessage[Command]  
        case HelloCommand(name) =>
          println(s"Hello $name")
          Behaviors.same
      
    ).onFailure(onFailure[IllegalStateException](SupervisorStrategy.restart))


【讨论】:

以上是关于如何在 Akka 中监督 actor 并处理异常的主要内容,如果未能解决你的问题,请参考以下文章

Akka: Actor监管 - 细述BackoffSupervisor

Akka 如何决定哪个 Actor 获得线程?

Akka框架使用注意点

Erlang VS Akka- Actor模型介绍

[scala] akka actor编程

Scala如何使用akka actor有效地处理超时操作