Akka actorFor与传递ActorRef的区别

16

我正在学习Akka,并试图弄清楚如何让演员彼此交谈(我们称之为AB)。这不是一个请求/响应场景,AB随时相互发送消息。

目前,我有两个兄弟演员,它们在双向传递消息。它们都直接在ActorSystem上创建。最初我将AActorRef传递给了B的构造函数。但是,我无法将BActorRef传递给A的构造函数,因为它尚不存在,即我无法使用此方法实现循环引用。

我一直在阅读关于actorFor 的内容,这将使我可以使用其路径查找演员。但是,我对这种设置感到不舒服,因为如果路径更改,则编译器将无法捕获它。

考虑到每个演员都可以访问其父级,另一个选择是将来自AB的消息传递给父级,然后由父级将消息传回AB 。但是,这会将父级与来回传递的消息类型耦合在一起。

人们用什么策略使演员彼此知道?我是否太谨慎地通过路径查找演员?


你尝试过在实例化ActorRef时使用lazy val吗?我可以想象这会有助于解决循环依赖问题。当然,假设你使用的是Scala... - agilesteel
我刚试了一下,它可以工作。我不知道在定义之前引用lazy val - 真是疯狂的事情!谢谢你的提示。我仍然很想知道人们如何看待传递ActorRefs vs路径。 - Geoff
请确保您已经阅读了http://doc.akka.io/docs/akka/2.0.2/general/addressing.html。 - sourcedelica
5
出于安全和分发的原因,我绝对不会使用懒加载变量的方法。相反,可以让父级向每个子级发送一条消息,告诉他们兄弟的身份(ActorRef)。 - Viktor Klang
1个回答

11

在我看来,你有三种策略,我从最靠近你的问题(但对我来说也是最糟糕的模式,很抱歉)开始列出。

策略1:创建Actor A和Actor B,将actorRef A传递给Actor B的构造函数。您的乒乓球将从Actor B发送消息到Actor A开始,Actor A可以简单地使用发送者引用进行回复。(或者反过来)


策略2:在您的应用程序中创建一个层,负责命名:它在创建Actor时分配名称,并在查询时进行分配。这将问题集中在一个单一点。


策略3:您会想知道两个兄弟Actor玩乒乓球是否正在替换更好、更模块化的Actor层次结构,基本上每个Actor只与其父母和孩子通信,并且不了解其兄弟的信息。


3
第三种策略似乎是最明智的。我有点担心父母最终会做很多有关连线的工作,但我想这没问题,因为协调孩子是父母的职责(而且,仅仅转发消息并不需要太多的工作量)。 - Geoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接