2015-09-07 58 views
2

将消息传递给间接相关参与者的最佳方式是什么?假设我有5个演员,其中每个演员都是先前演员(父母)的孩子,演员#2有多个孩子。最底层的演员#5(演员#1是否在这个例子的顶部)能够充分传递一个消息给演员#2的间接相关儿童之一?下面将消息传递给间接相关的参与者

素描:箭头指向童星表示消息

现在,我得到的是,这里的演员选拔机制的工作,但根据官方文档阿卡,应避免使用,除非你正在利用远程的。那么,最好是在某个地方举办一次全球单身人士参考演员#1并从那里传递消息?如果这条链变得更复杂会怎么样?我忘了一些邪恶的设计模式来解决这个问题吗?

如果以前回答过类似的问题,我会很感激,如果您可以将其链接到我,因为我找不到它。

具体而言,我目前在Java中使用Akka。基于Scala的解决方案也受到欢迎。

child actor

回答

0

我看到2种方式:

  1. 通行证孩子的ActoRef在构造函数#5演员。
  2. 让另一位演员担任“接待员”,该接待员将持有所需的ActorRef s列表,并将其作为对某些提问信息的回复发送给他们。
+0

我不喜欢不得不多次传递同一个演员参考。它可能会在服务被隔离和松散耦合的复杂架构中破坏语义。我更喜欢第二种解决方案,但它并不完全符合我的要求。 – ExecutorService

+1

如果你想要孤立和松散耦合的服务,我想你应该使用actorSelection – ka4eli

3

在这种情况下,我不会有使用Actor选择的问题,但是文档并没有声明当使用refs时可以避免Actor选择。如果您以这种方式将许多来自演员#5的消息发送给同一个孩子,则可以先使用演员选择以获得具有resolveOne的演员引用,然后使用该ActorRef进行后续通信。也许是一个合理的妥协。

如果你不想使用Actor选择,我不会使用全局单例,而是使Actor的构造函数的actorRef部分成为Actors 3,4和5,以便引用传递给Actor 5我认为它警告说,不要演员选择同一文件给出了答案选择:

在可演员创作或 初始化期间提供ActorRefs所有其他情况下,由父母传递他们的孩子或引入 演员将他们的ActorRefs发送给消息中的其他Actor。

一个比较另类,是使用发布和订阅机制:http://doc.akka.io/docs/akka/snapshot/scala/event-bus.html

如果儿童演员已订阅的频道,演员#5可以将消息发布到通道,而无需知道的身份订户。

+0

http://doc.akka。io/docs/akka/2.3.13/java/untyped-actors.html#Identifying_Actors_via_Actor_Selection “使用ActorRef而不是依赖ActorSelection与其他Actor进行通信总是可取的,例外是 使用At-最少一次交付设施 发起与远程系统的第一次联系“ – ExecutorService

+0

谢谢。 TBH,我认为文档的相同部分为您提供了最佳答案“在所有其他情况下,可以在Actor创建或初始化期间提供ActorRefs,将它们从父母传递给子代,或者通过将其ActorRefs发送给消息中的其他Actor来引入Actor。 – mattinbits

+0

这很糟糕:/。我诚实地希望为Akka提供更好的解决方案。 – ExecutorService