akka 使用询问模式的请求-响应

xe55xuns  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(173)

我对Akka相当陌生,并浏览了Akka文档的这个请求-响应示例。
我理解这种模式的工作原理如下:

  1. X1 M0 N1 X通过发送X1 M2 N1 X的协议的消息来询问X1 M1 N1 X。
  2. X1 M3 N1 X通过向X1 M4 N1 X发送其自己协议的消息来应答。
    1.不知道X1 M6 N1 X的协议的X1 M5 N1 X获得适配的响应并将其重新发送给它自己。
  3. X1 M7 N1 X接收适配的响应并继续其有效载荷。
context.ask(dave, Dave.Request) {
  case Failure(exception) => throw exception
  case Success(response) => AdaptedResponse(response.payload)
}

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

zzlelutf

zzlelutf1#

在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获得响应(您可以为自己安排一条消息来解决超时问题)。
请注意,这实际上是将两个参与者纠缠在一起。它适用于父参与者将一个长期运行的任务交给子参与者的情况,但在大多数/所有其他场景中,这是一个非常值得怀疑的方法。

相关问题