【问题标题】:Akka supervision strategies and terminationAkka 监督策略和终止
【发布时间】:2015-11-14 20:38:22
【问题描述】:

我是 Akka 的新手,我正在努力解决 SupervisorStrategies 和儿童演员终止的问题。我有几个非常相似的担忧。

首先,我的理解是如果一个actor创建另一个actor(通过context.actorOf(...)),那么它自动成为创建actor的父/主管。这是唯一一个演员可以成为另一个演员的父母/主管的方式。

如果我上面说的有什么不正确的地方,请先纠正我!但是,假设我或多或少地步入正轨,那么当多个父 Actor 创建同一个子 Actor 的实例时会发生什么:

// Groovy pseudo-code.
class Fizz extends UntypedActor {
    @Override
    void onReceive(Object message) {
        ActorRef buzz = context.system.actorOf(Props.create(Buzz), "buzz")
        buzz.tell("Hello buzz!", self)
    }
}

class Foo extends UntypedActor {
    @Override
    void onReceive(Object message) {
        ActorRef buzz = context.system.actorOf(Props.create(Buzz), "buzz")
        buzz.tell("Meh!", self)
    }
}

在上面的例子中,FizzFoo 的父母是同一个 Buzz 演员实例,还是两个 Buzz 的实例?如果是多个实例,我可以假设终止一个实例只会终止该实例吗?或者如果Foo 终止/停止其Buzz 实例,那是否也会终止/停止Fizz 的实例?

【问题讨论】:

    标签: akka akka-supervision akka-actor


    【解决方案1】:

    首先这两个是不同的:

    context.system.actorOf(Props.create(Buzz), "buzz")
    context.actorOf(Props.create(Buzz), "buzz")
    

    context.system.actorOf() 创建顶级用户角色。为了创建子actor,你必须使用context.actorOf()。其余答案将假定您使用后一种方法。

    Akka 的演员监督系统是分层的。 这意味着每个演员只有一个父母。 所以你的问题:

    Fizz 和 Foo 是同一个 Buzz 演员实例的父母,

    为假,Buzzactor 创建自FooBuzz 创建自Fizz,是不同的实例,具有不同的父级。

    您可以通过查看演员的路径来确认。 由Foo 创建的Buzz 具有类似于akka://<system_name>/user/foo/buzz 的路径,由Fizz 创建的Buzz 具有类似于akka://<system_name>/user/fizz/buzz 的路径

    (我不使用java,但也许您可以通过ActorRefActorgetPath()方法获取actor路径)

    另外,context.system.actorOf() 创建的 Buzz actor 具有类似 akka://<system_name>/user/buzz 的路径,由 User Guardinan actor 直接监督。

    所以actor路径之间的关系是:

    • akka://<system_name>/user/fizz/buzzBuzz 的实例)由 akka://<system_name>/user/fizzFizz 的实例)监督
    • akka://<system_name>/user/foo/buzzBuzz 的另一个实例)由 akka://<system_name>/user/fooFoo 的实例)监督。

    因此你的主要问题:

    我可以假设终止一个实例只会终止那个实例吗?或者,如果 Foo 终止/停止其 Buzz 实例,是否也会终止/停止 Fizz 的实例?

    前者是正确的。

    阅读 akka 文档了解更多详情:

    【讨论】:

    • 感谢@ymonad (+1) 的帮助-您能否确认我的声明,即创建儿童演员会让您成为父母?我只是担心父母可能需要进行一些 API 调用才能将子演员“绑定”到它等等。再次感谢!
    • @smeeb 不,不需要额外的 API 来绑定作为孩子的演员。只需在 Actor 内部调用 context.actorOf() 即可创建新的子 Actor。
    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 2018-03-17
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多