如何将 Akka 的监管策略与更具体的不可恢复错误处理相结合?



说我有以下简单模型:一个上层演员(例如ReportService(接受慢速异步操作的请求,并使用许多委托参与者来执行失败parther-prone。子任务,遵循错误内核模式。

子任务将从数据库中检索数据,以产生报告文件,以在某个地方的文件存储上发布文件。

当最高请求任务之一完成时,我希望ReportService Actor通知请求用户的完成。

到目前为止,这一切都非常适合我对演员模型的理解,但是我不明白如何优雅地处理不可恢复的失败案例。所有监督策略等都很清楚,但是如果重新恢复后无法完成请求,我该如何向用户发送通知,详细说明发生的特定错误?

例如,如果我用完了磁盘空间,那么我无能为力恢复。我希望ReportService能够识别该操作在此特定阶段失败,并将通知解释给用户。我目前的解决方案是手动将错误包裹在儿童演员中,并基本上发送Either类型消息,但这似乎不太适合"让它崩溃"理念。

tl; dr:是否有一种方法可以访问导致子演员在父亲演员中失败的可投掷,目的是将其转发到其他地方?

您可以访问母公司内部的监督策略实施中的可投掷(来自Akka Docs(:

val supervisorStrategy =
  OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
    case _: ArithmeticException      => Resume
    case _: NullPointerException     => Restart
    case _: IllegalArgumentException => Stop
    case _: Exception                => Escalate
  }

编辑

在您的情况下,您可以做这样的事情:

val supervisorStrategy =
      AllForOneStrategy {
        case e: Throwable => 
            notifyUser(e)
            Stop
      }

编辑2响应评论

根据文档(注(,您可以获得对发送演员的参考。


备注:

另一个选项是用所有必要的信息编写自定义异常,然后将其抛出而不是默认异常。

相关内容

最新更新