【问题标题】:Passing messages to indirect related actors将消息传递给间接相关的参与者
【发布时间】:2015-12-02 23:13:34
【问题描述】:

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

下图:指向代表消息的子actor的箭头

现在我知道这里的参与者选择机制可以工作,但根据 Akka 官方文档,除非您使用远程处理,否则应该避免使用它。那么,最好在某个地方简单地保存一个对 Actor #1 的全局单例引用并从那里向下传递消息?如果这个链条变得更加复杂怎么办?我是否忘记了一些邪恶的设计模式来解决这个问题?

如果之前有人回答过与此类似的问题,如果您能将我链接到它,我将不胜感激。

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

【问题讨论】:

    标签: java scala concurrency akka message-passing


    【解决方案1】:

    在这种情况下使用 Actor Selection 不会有问题,但是文档确实指出,当可以使用 refs 时最好避免 Actor Selection。如果您以这种方式从 Actor #5 向同一个孩子发送许多消息,您可以预先使用 Actor Selection 来获取带有 resolveOne 的 ActorRef,然后使用该 ActorRef 进行后续通信。也许是一个合理的妥协。

    如果您不想使用 Actor Selection,我不会使用全局单例,而是将 actorRef 作为 Actor 3、4 和 5 的构造函数的一部分,以便将引用传递给 Actor 5。我认为警告演员选择的相同文档给出了替代方案的答案:

    在所有其他情况下,ActorRefs 可以在 Actor 创建期间提供,或者 初始化,将它们从父级传递给子级或引入 Actors 通过在消息中将他们的 ActorRefs 发送给其他 Actors。

    另一种选择是使用发布和订阅机制:http://doc.akka.io/docs/akka/snapshot/scala/event-bus.html

    如果子 Actor 订阅了频道,Actor #5 可以向该频道发布消息,而无需知道订阅者的身份。

    【讨论】:

    • doc.akka.io/docs/akka/2.3.13/java/… "最好使用他们的 ActorRef 与其他 Actor 进行通信,而不是依赖于 ActorSelection。例外情况是使用至少一次传递工具发送消息以启动与远程系统的第一次联系"
    • 谢谢。 TBH,我认为文档的同一部分为您提供了最佳答案“在所有其他情况下,可以在 Actor 创建或初始化期间提供 ActorRefs,将它们从父级传递给子级,或者通过在消息中将 ActorRefs 发送给其他 Actors 来引入 Actors。”
    • 这太糟糕了:/。老实说,我希望 Akka 能够提供更好的解决方案。
    • 我还没有调查事件,所以我一定会看看。从你到目前为止所描述的,我喜欢它。
    【解决方案2】:

    我看到了两种方式:

    1. 将孩子的ActoRef 在构造函数中传递给#5 演员。
    2. 让另一位演员担任“接待员”,他将持有所需ActorRefs 的列表,并将他们作为对某些询问消息的回复发送给他们。

    【讨论】:

    • 我真的不喜欢将同一个演员引用多次向下传递。它可能会破坏服务被隔离和松耦合的复杂架构中的语义。我更喜欢第二种解决方案,但它并不完全是我想要的。
    • 如果你想要隔离和松耦合的服务,我认为你应该使用actorSelection
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 2020-09-20
    • 2012-12-31
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多