【问题标题】:How to design AKKA Supervisor Strategy如何设计 AKKA 主管策略
【发布时间】:2015-12-05 03:24:20
【问题描述】:

我设计了一个actor系统监督策略,如下所示。 MyTopSupervisor 是所有演员的超级主管,所有错误都从子演员升级。 我的问题是:我应该在顶级主管的子角色中处理所有升级、重新启动和停止的错误吗?

含义: 我应该在MyTopSupervisor 中重复由MyOtherSupervisor 处理的所有错误,还是应该在MyOtherSupervisor 中处理低级错误,并且只在MyTopSupervisor 上处理escalated 错误?

class MyTopSupervisor extends UntypedActor {

    private static SupervisorStrategy strategy = new AllForOneStrategy(2,
            Duration.create(5, TimeUnit.MINUTES),

            new Function<Throwable, Directive>() {
                @Override
                public Directive apply(Throwable t) {

                    if (t instanceof SQLException) {
                        log.error("Error: SQLException")
                        return restart()
                    } else if (t instanceof IllegalArgumentException) {
                        log.error("Error: IllegalArgumentException")
                        return stop()
                    } else {
                        log.error("Error: GeneralException")
                        return stop()
                    }
                }
            });

    @Override
    public SupervisorStrategy supervisorStrategy() { return strategy }

    @Override
    void onReceive(Object message) throws Exception {
         // CREATE A CHILD OF MyOtherSupervisor
         // WATCH THE CHILD
         // do something with message
    }
}


class MyOtherSupervisor extends UntypedActor {

    private static SupervisorStrategy strategy = new OneForOneStrategy(2,
            Duration.create(5, TimeUnit.MINUTES),

            new Function<Throwable, Directive>() {
                @Override
                public Directive apply(Throwable t) {

                    if (t instanceof SQLException) {
                        log.error("Error: SQLException")
                        return escalate()
                    } else if (t instanceof IllegalArgumentException) {
                        log.error("Error: IllegalArgumentException")
                        return stop()
                    } else {
                        log.error("Error: GeneralException")
                        return escalate()
                    }
                }
            });

    @Override
    public SupervisorStrategy supervisorStrategy() { return strategy }

    @Override
    void onReceive(Object message) throws Exception {
        // do something with message
    }
}

【问题讨论】:

  • 我认为这取决于您的 MyOtherSupervisor 是否可以根据需要处理异常。您希望您的 MyOtherSupervisor 能够度过异常吗?如果您列出您对设计的一些担忧,也许会有所帮助。

标签: akka


【解决方案1】:

我认为这取决于您尝试对应用程序执行的操作。如果您有这些嵌套的主管(TopSupervisor -> MidSupervisor -> ChildWorkerActor)以具有强大的容错能力,那么我会尝试捕获 MidSupervisor 中的所有异常并升级需要的真正糟糕的异常(显示停止程序或意外的异常)交给大老板(TopSupervisor)处理。

可以将其想象为百货公司工作或其他事情的运作方式。您有与客户打交道的员工。当客户遇到楼层员工无法解决的问题时,他们会求助于他们的主管。如果主管无法处理,那么他会求助于轮班经理,或者在这种情况下是 TopSupervisor。

来自 Akka 文档:

…参与者自然形成层次结构。一名演员,负责监督 程序中的某些功能可能希望将其任务拆分为 更小,更易于管理的部分。为此,它开始了孩子 它监督的演员。

http://doc.akka.io/docs/akka/2.4.1/general/actor-systems.html#Hierarchical_Structure

所以回答你的问题,只要你保持一个层次结构,你就不想在两个主管中重复异常,因为你不必这样做。

我鼓励您查看 Typesafe 的网络研讨会/播客和 Akka 文档。

https://www.typesafe.com/resources/videos#filter:akka

http://doc.akka.io/docs/akka/2.4.1/java.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2017-05-19
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多