akka.net Tell (object) 与 Tell (object, IActorRef)

akka.net Tell (object) vs Tell (object, IActorRef)

有什么区别?据我了解,Tell (object, IActorRef) 发送原始发件人。但是为什么不只使用 Forward 方法呢?

谢谢

您可以将 actorRef.Tell(msg) 视为 actorRef.Tell(msg, Context.Self) 的快捷方式,而 actorRef.Forward(msg) 保留原始邮件发件人。这也意味着,您需要在后台有一个活动的参与者上下文来定义任何有意义的发件人。

使用 Tell(object, IActorRef) 允许您将 Sender 设置为您喜欢的任何 actor ref,包括像模拟另一个 actor 或 ActorRefs.NoSender 之类的东西,这可以用于减少发送的有效负载的大小电线,因为消息发送者不会被序列化。

在某些远程场景中,如果您不希望向 Sender 发送答案,使用 actorRef.Tell(msg, ActorRefs.NoSender) 可能会带来不错的性能优势。

为什么? IActorRef 被序列化为 URI 字符串(例如:akka.tcp://system-name@localhost:9001/user/parent/child)。当您发送小消息时,即股票价格变动或游戏角色位置变化,这可能意味着您的有效载荷中最昂贵的部分实际上是发件人。

反序列化 IActorRef 也需要一些额外的时间,因为 actor 提供者需要为其解析正确的消息传输。

出于这些原因,如果您不需要 Sender,使用 ActorRefs.NoSender 可能是一个有效的选择。