gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:59:00 25 4
gpt4 key购买 nike

假设我问(?)同一个 Actor 有两个回答。
它存储发件人以备后用。
稍后,它会将消息返回给发件人。我们得到了正确的发送者(散列到消息中的那个)但是 Akka 如何知道响应是针对哪条消息的呢?
ActorRef 中是否有指示每个响应针对哪条消息的内容?

是“ channel ”吗?

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

代码示例:

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 ,你可以说:

context.path

从外面 Actor ,如果您有 ActorRef ,你可以说:
ref.path

这个路径是单个actor实例的地址,我相信内部路由系统如何将消息路由到actor实例的邮箱。当您在 Actor 之外时,就像您在示例中循环和发送消息时一样,当您使用 ask 时( ?),临时的 Actor实例已启动,以便当 Actor收到消息需要响应,它有一个响应的路径。这可能有点过于简单化,它可能不是您正在寻找的详细程度,因此如果我错过了您的问题的要点,我深表歉意。

另外, sender变量在 ActorActorRef ,因此它有一条路径,因此您可以返回到它。

Future创建后,akka 创建一个临时的(和可寻址的) Actor这基本上是在为 Future 提供服务.当那个临时 Actor发送到另一个 Actor ,其 ActorRef作为发送者传输。当接收方正在处理该特定消息时,发送方 var设置为 ActorRef对于那个临时 Actor ,这意味着您有一个地址要回复。即使您决定稍后再联系该发件人,您仍然有一个地址可以发回并最终完成 Future临时 Actor 正在服务。关键是,只要你有 ActorRef ,无论是请求还是响应,它所做的只是将消息路由到该路径 ActorRef .
Ask (?)tell (!)真的没有太大的不同。 Ask基本上是 tell发送方期望接收方 tell一条消息回它。

关于akka - akka 如何知道哪个特定的消息回复与正确的 future 相关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16225070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com