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

时间:2017-10-12 20:39:33

标签: c# akka.net

有什么区别?据我所知,Tell(对象,IActorRef)发送原始发件人。但为什么不使用Forward方法?

谢谢

1 个答案:

答案 0 :(得分:5)

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

使用Tell(object, IActorRef)允许您将Sender设置为您喜欢的任何actor,包括模仿另一个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可能是有效选项。