【问题标题】:How does akka know which specific message reply is associated with the correct future?akka 如何知道哪个特定的消息回复与正确的未来相关联?
【发布时间】:2013-04-25 21:30:15
【问题描述】:

假设我问(?)同一个演员的两个回答。 它存储发件人以供以后使用。 稍后,它会将消息返回给发件人。我们得到了正确的发件人(散列到消息的那个),但是 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 如何确保消息返回到正确的参与者??

【问题讨论】:

    标签: akka actor future


    【解决方案1】:

    每个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 回复一条消息。

    【讨论】:

    • 谢谢 - 我明白这一点 - 我的问题不是发件人如何知道消息将发送给哪个参与者,而是它具体响应的消息。如果我产生 100 个期货,akka 怎么知道回复是针对哪条消息(或确实是针对哪条消息)
    • 我更改了问题的标题以更好地反映我的意图。不过再次感谢!
    • 我在回复中添加了一些内容。仍然不确定它是否能回答你的问题......
    • 哦,我明白了,所以响应路径不是参与者,而是消息的键控?我去看看 - 谢谢。
    • 太好了 - 感谢您的帮助。所以临时演员是在 /temp 路径上创建的。因此,每个请求都会有不同的发送者路径指向短暂的演员。再次感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多