Akka监管策略与终止

Akka监管策略与终止,akka,akka-supervision,akka-actor,Akka,Akka Supervision,Akka Actor,我是Akka的新员工,我正试图了解主管策略和儿童演员终止。我有几个非常相似的担忧 首先,我的理解是,如果一个参与者创建了另一个参与者(通过context.actorOf(…)),那么它将自动成为该参与者的家长/主管。这是演员成为另一个演员的家长/主管的唯一方式 如果我上面所说的任何错误,请先纠正我!但是,假设我或多或少已经走上正轨,那么当多个父角色创建同一个子角色的实例时会发生什么情况: // Groovy pseudo-code. class Fizz extends UntypedActor

我是Akka的新员工,我正试图了解主管策略和儿童演员终止。我有几个非常相似的担忧

首先,我的理解是,如果一个参与者创建了另一个参与者(通过
context.actorOf(…)
),那么它将自动成为该参与者的家长/主管。这是演员成为另一个演员的家长/主管的唯一方式

如果我上面所说的任何错误,请先纠正我!但是,假设我或多或少已经走上正轨,那么当多个父角色创建同一个子角色的实例时会发生什么情况:

// 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)
    }
}

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

首先,这两个实例是不同的:

context.system.actorOf(Props.create(Buzz), "buzz")
context.actorOf(Props.create(Buzz), "buzz")
context.system.actorOf()
创建顶级用户参与者。为了创建子actor,必须使用
context.actorOf()
。答案的其余部分将假定您使用后一种方法

Akka的演员监督系统是分层的。 这意味着每个参与者只有一位家长。 所以你的问题是:

Fizz和Foo是同一Buzz演员的父母吗

如果为false,则从
Foo
创建的
Buzz
演员和从
Fizz
创建的
Buzz
是不同的实例,具有不同的父实例

您可以通过查看参与者的路径来确认它。
Foo
创建的
Buzz
的路径类似于
akka:///user/foo/buzz
和由
Fizz
创建的
Buzz
的路径类似于
akka:///user/fizz/buzz

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

此外,由
context.system.actorOf()
创建的
Buzz
参与者的路径类似于
akka:///user/buzz
,由演员直接监督

因此,参与者路径之间的关系是:

  • akka:///user/fizz/buzz
    (嗡嗡声的安装)由
    akka:///user/fizz
    Fizz
    的实例)
  • akka:///user/foo/buzz
    (另一个
    Buzz
    实例)由
    akka:///user/foo
    Foo
    的实例)
因此,你的主要问题是:

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

前者是正确的

有关更多详细信息,请阅读akka文档:


感谢@ymonad(+1)提供的帮助-你能确认我的说法吗,即创造一个儿童演员会让你成为他的父母?我只是担心家长可能需要进行一些API调用,以便将儿童演员“绑定”到该API,等等。再次感谢@smeeb不,不需要额外的API来绑定演员的孩子。只需在actor内部调用
context.actorOf()
,即可创建新的子actor。