【发布时间】:2013-10-18 13:00:16
【问题描述】:
这是一个设计问题;
假设我有一棵执行大量处理的演员树。处理由客户端/连接参与者启动(即树是服务器)。最终,客户端参与者想要一个响应。 IE。我有一个看起来像这样的演员系统。
ActorA <---reqData--- Client_Actor
| msgA /|\
\|/ |
ActorB |
msgB | \ msgD |
\|/ \/ |
ActorC ActorD---------msgY-->|
|_____________msgX_________|
客户端系统想要的响应是叶参与者的输出(即ActorC 和/或ActorD)。树中的这些参与者可能正在与外部系统交互。这棵树可能是一组预定义的可能路由的actors(即Client_actor 只是有一个actorref 指向actor 树的根,ActorA)。
问题是管理将响应(msgX 和/或 msgY)从 final/leaf actor 发送回客户端 actor 的最佳模式是什么?
我能想到以下选项;
- 为每个连接客户端创建一个树并让参与者跟踪发送者,当他们获得
msgX或msgY时,将其发送回原始发送者参考,以便消息通过树。即每个演员将保留原始发件人的参考。 - 以某种方式在
reqData消息中发送Client_Actor引用并将其复制到树中使用的所有消息,以便叶参与者可以直接回复Client_actor... 这似乎是性能最高的选项。不知道如何做到这一点(我正在以某种方式在包含客户端actor ref 的消息案例类上考虑一个特征)... - 不知何故,根据通过树传递的消息中的唯一 ID 查找客户端 Actor,或使用 Actorselection(不确定这与远程处理的效果如何)...
- 更好的东西...
仅供参考,我使用的是 Akka 2.2.1。
干杯!
【问题讨论】:
-
应该将 msgX 和 msgY 都传递给客户端 Actor,还是发送一条消息应该取消发送另一条消息?
-
客户端actor可能期望
msgX、msyY或两者兼有msgX & msgY,具体取决于reqData消息中捕获的状态。为简单起见,假设客户端 Actor 知道它想要什么(即为此效果创建期货)并且 ActorB 将有条件地向叶子 Actor 发送消息。
标签: scala design-patterns akka message-passing akka-cluster