与Actors合作时,如果演员需要与多个其他演员合作以完成请求,那么这里推荐的方法是什么?更确切地说,如果Actor A(通过处理消息M)需要从Actor B + Actor C中检索信息,那么它可以异步地向Actor B + C发送消息,但它应该如何将来自Actor B + C的响应关联到原始消息M?
我已经看过Akka框架并且无法看到这是如何完成的,所以必须自己实现一些东西,其中Actor跟踪已发送的消息并尝试将其响应关联回源消息。我必须遗漏一些东西,因为我认为这种行为已经被构建到各种Actor框架中
答案 0 :(得分:2)
通常,如果您需要发送消息并获得相关响应,则最终必须在原始消息中发送某种nonce,响应者必须返回该消息。这可以是显式的,也可以在消息传递层中得到支持。不确定Akka,但这就是Erlang如何处理OTP中的RPC。
答案 1 :(得分:1)
只需创建一个新的actor并使用它来保留上下文并在超时或执行“join”后停止它。 您还可以使用Future-composition而不是生成actor:
class A extends Actor {
def receive = {
case DoX(x) =>
val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult]
val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult]
b zip c map { case (b,c) => merge(b,c) } pipeTo sender
}
}
}
或数据流:
class A extends Actor {
def receive = {
case DoX(x) => flow {
val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult]
val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult]
merge(b(),c())
} pipeTo sender
}
}
}