Akka 监督策略和终止

Akka supervision strategies and termination

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

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

如果我上面说的不对,请先纠正我!但是,假设我或多或少走上正轨,那么当多个 parent 演员创建同一个 child 演员的实例时会发生什么:

// 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 parent 是同一个 Buzz actor 实例,还是 Buzz 的两个实例?如果它是多个实例,我可以假设终止一个实例只会终止该实例吗?或者如果 Foo terminates/stops 它的 Buzz 实例,那是否也是 terminate/stop Fizz 的实例?

首先这两个是不同的:

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

context.system.actorOf() 创建顶级用户参与者。为了创建 child 个演员,您必须使用 context.actorOf()。其余答案将假定您使用后一种方法。

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

are Fizz and Foo parents to the same Buzz actor instance,

为false,BuzzFoo创建的actor和Fizz创建的Buzz是不同的实例,具有不同的parent。

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

(我不使用java,但也许你可以通过ActorRefActorgetPath()方法来获取演员路径)

另外 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 的实例)监督。

因此您的主要问题:

can I assume that terminating one instance only terminates that instance? Or if Foo terminates/stops its Buzz instance, does that also terminate/stop Fizz's instance?

前者正确。

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