这是一个设计问题;
假设我有一个执行大量处理的 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
... 这似乎是性能最高的选项。不知道如何做到这一点(我正在考虑以某种方式在保存客户端角色引用的消息案例类上的特征)... 仅供引用,我正在使用 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/