akka如何知道哪个特定的消息回复与正确的未来相关联



假设我向同一个参与者询问两个响应。它为以后存储发送者。稍后,它将消息返回给发送者。我们得到了正确的发送者(散列到消息的发送者),但是Akka如何知道响应是针对哪条消息的呢?ActorRef中是否有指示每个响应对应哪个消息的东西?

是"通道"吗?

我想更好地理解底层技术。我将试着同时阅读源代码,但我认为这是一个非常好的问题。

代码示例:

class TestActor
[...]
def onReceive = {
case r: MessageToGoOut ⇒
      messageId += 1
      val requestId = clientConnectionId + messageId 
      senders += (requestId -> sender) //store sender for later
      anotherActor ! WrappedUpMessage(requestId, MessageOut))
case m: MessageToGoBackToSender ⇒
          val requestId = m.requestId
          senders.get(requestId) map { client ⇒
            client ! Response(m.message)
            senders -= requestId
          }
}

val futures = for(i <- 1 to 100) yield testActor ? new MessageToGoOut ("HEYO!" + i)

现在akka如何确保消息返回到正确的actor?

每个Actor都有一个路径。在Actor内部,你可以说:

context.path

Actor之外,如果你有ActorRef,你可以说:

ref.path

此路径是单个actor实例的地址,我认为这是内部路由系统将消息路由到actor实例的邮箱的方式。当您在Actor之外时,就像您在示例中循环和发送消息时一样,当您使用ask (?)时,会启动一个临时Actor实例,以便当接收消息的Actor需要响应时,它有一个路径来响应。这可能有点过于简化了,它可能不是你想要的细节水平,所以如果我错过了你问题的要点,我很抱歉。

同样,Actor中的sender变量是ActorRef,因此它有一个路径,因此您可以路由回它。

当创建Future时,akka创建一个临时的(可寻址的)Actor,它基本上为Future服务。当临时Actor发送给另一个Actor时,它的ActorRef作为发送方发送。当接收参与者处理该特定消息时,发送方var被设置为该临时参与者的ActorRef,这意味着您有一个要响应的地址。即使您决定稍后保留该发送方,您仍然有一个地址可以发送回,并最终完成临时参与者正在服务的Future。关键是,只要您有ActorRef,无论是请求还是响应,它所做的只是将消息路由到该ActorRef的路径。

Ask (?)tell (!)真的没有太大的不同。Ask基本上是一个tell,发送方期望接收方将tell消息返回给它。

最新更新