首页 > 解决方案 > 请求模式的请求响应

问题描述

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

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

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

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

标签: scalaakka

解决方案


在 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(您可以为自己安排一条消息以解决超时问题)。

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


推荐阅读