具有请求模式的请求响应



我对Akka还很陌生,并浏览了Akka文档的这个请求-响应示例。

我理解这种模式的工作原理如下:

  1. Dave通过发送Hal的协议的消息来询问Hal
  2. CCD_ 4通过向CCD_
  3. 不知道Hal的协议的Dave得到适应的响应并重新发送给它自己
  4. CCD_ 8接收经调整的响应并继续其有效载荷
context.ask(dave, Dave.Request) {
case Failure(exception) => throw exception
case Success(response) => AdaptedResponse(response.payload)
}

但是,如果Dave当场直接需要response.payload,会发生什么呢?这可能吗?

在Akka Typed中,使用context.ask是不可能的,尽管我会质疑您为什么特别需要它。

作为一种替代方案,当您有两个参与者交互时,您可以在他们之间定义一个联合协议:

object Hal {
sealed trait Command
sealed trait CommandFromDave extends Command {
def replyTo: ActorRef[Dave.ResponseFromHal]
}
case class OpenThePodBayDoorsPlease(override val replyTo: ActorRef[Dave.ResponseFromHal]) extends CommandFromDave
}
object Dave {
sealed trait Command
sealed trait ResponseFromHal extends Command
case class MessageFromHal(msg: String) extends ResponseFromHal
}

那么Dave可以只是

hal ! Hal.CommandFromDave(context.self)

并直接从Hal获得响应(您可以为自己安排一条消息来解释超时(。

请注意,这确实将两个演员纠缠在一起。它适用于父参与者将长期任务推迟给子参与者的情况,但在大多数/所有其他情况下,这是一种非常值得怀疑的方法。

最新更新