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)
}
}
在上面的例子中,Fizz
和 Foo
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,Buzz
从Foo
创建的actor和Fizz
创建的Buzz
是不同的实例,具有不同的parent。
您可以通过查看演员的路径来确认。
Foo
创建的 Buzz
的路径类似于 akka://<system_name>/user/foo/buzz
,而 Fizz
创建的 Buzz
的路径类似于 akka://<system_name>/user/fizz/buzz
(我不使用java,但也许你可以通过ActorRef
或Actor
的getPath()
方法来获取演员路径)
另外 context.system.actorOf()
创建的 Buzz
actor 有类似 akka://<system_name>/user/buzz
的路径,直接由 User Guardinan actor 监督。
所以actor路径的关系是:
akka://<system_name>/user/fizz/buzz
(Buzz
的实例)由 akka://<system_name>/user/fizz
(Fizz
的实例) 监督
akka://<system_name>/user/foo/buzz
(Buzz
的另一个实例)由 akka://<system_name>/user/foo
(Foo
的实例)监督。
因此您的主要问题:
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 文档了解更多详情:
我是 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)
}
}
在上面的例子中,Fizz
和 Foo
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,Buzz
从Foo
创建的actor和Fizz
创建的Buzz
是不同的实例,具有不同的parent。
您可以通过查看演员的路径来确认。
Foo
创建的 Buzz
的路径类似于 akka://<system_name>/user/foo/buzz
,而 Fizz
创建的 Buzz
的路径类似于 akka://<system_name>/user/fizz/buzz
(我不使用java,但也许你可以通过ActorRef
或Actor
的getPath()
方法来获取演员路径)
另外 context.system.actorOf()
创建的 Buzz
actor 有类似 akka://<system_name>/user/buzz
的路径,直接由 User Guardinan actor 监督。
所以actor路径的关系是:
akka://<system_name>/user/fizz/buzz
(Buzz
的实例)由akka://<system_name>/user/fizz
(Fizz
的实例) 监督
akka://<system_name>/user/foo/buzz
(Buzz
的另一个实例)由akka://<system_name>/user/foo
(Foo
的实例)监督。
因此您的主要问题:
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 文档了解更多详情: