scala - Akka Pattern - Actor 树,回复原文

标签 scala design-patterns akka message-passing akka-cluster

这是一个设计问题;

假设我有一个执行大量处理的 Actor 树。处理由客户端/连接参与者启动(即树是服务器)。最终客户端actor想要一个响应。 IE。我有一个看起来像这样的 Actor 系统。

    ActorA  <---reqData--- Client_Actor
       | msgA                    /|\                      
      \|/                         |                 
    ActorB                        |                  
  msgB |  \ msgD                  | 
      \|/  \/                     | 
    ActorC  ActorD---------msgY-->|
       |_____________msgX_________|

客户端系统想要的响应是叶actor的输出(即 ActorC 和/或 ActorD )。树中的这些参与者可能正在与外部系统交互。这棵树可能是一组预定义的可能路由的actor(即 Client_actor 只有一个actor 树的根的actorref, ActorA )。

问题是管理将响应( msgX 和/或 msgY )从最终/叶子 Actor 发送回客户端 Actor 的最佳模式是什么?

我可以想到以下选项;
  • 为每个连接客户端创建一个树,并让参与者在收到 msgX 时跟踪发件人。或 msgY , 将其发送回原始发件人 ref,以便消息通过树向上传递。即每个 Actor 都会保留原始发件人的引用。
  • 不知何故发送了Client_Actor引用 reqData消息并为树中使用的所有消息复制此消息,以便叶参与者可以直接回复 Client_actor ... 这似乎是性能最高的选项。不知道如何做到这一点(我正在考虑以某种方式在保存客户端角色引用的消息案例类上的特征)...
  • 以某种方式根据通过树传递的消息中的唯一 id 查找客户端角色或使用角色选择(不确定这与远程处理的效果如何)...
  • 更好的东西...

  • 仅供引用,我正在使用 Akka 2.2.1。

    干杯!

    最佳答案

    您可以使用 forward方法将消息从原始发件人转发到每个级别的子发件人。

    在 Client_Actor 中:

    actorA ! "hello"
    

    在ActorA中:
    def receive = {
      case msg =>
        ???
        actorB forward msg
    }
    

    在ActorB中:
    def receive = {
      case msg =>
        ???
        actorC forward msg
    }
    

    在 ActorC 中:
    def receive = {
      case msg =>
        ???
        sender ! "reply" // sender is Client_Actor!
    }
    

    在这种情况下,消息的 'sender' 字段永远不会改变,因此 ActorC 将回复原来的 Client_Actor!

    您可以使用 tell 进一步扩展它。允许您指定发件人的方法变体:
    destinationActor.tell("my message", someSenderActor);
    

    关于scala - Akka Pattern - Actor 树,回复原文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301335/

    相关文章:

    scala - 异常抛出的类型为 `Nothing` ?

    java - 重构 if 语句以使用适当的模式

    java - 是否使用静态方法?

    scala - 在 Scala 中,为什么没有 `Future.onComplete` 的实现?

    scala - 如何从标准输入获取 Actor 信息?

    scala - Untyped vs TypedActors - 为什么要使用 untyped?

    json - Play Framework : How to replace all the occurrence of a value in a JSON tree

    scala - 在不同的类中访问 Spark 广播变量

    scala - 任何适用于 Scala 的 UML 工具

    java - 返回破坏封装的 lambda 是否是糟糕的设计标志