【发布时间】:2017-10-12 20:39:33
【问题描述】:
有什么区别?据我了解,Tell(对象,IActorRef)发送原始发件人。但是为什么不只使用 Forward 方法呢?
谢谢
【问题讨论】:
有什么区别?据我了解,Tell(对象,IActorRef)发送原始发件人。但是为什么不只使用 Forward 方法呢?
谢谢
【问题讨论】:
您可以将actorRef.Tell(msg) 视为actorRef.Tell(msg, Context.Self) 的快捷方式,而actorRef.Forward(msg) 保留原始消息发件人。这也意味着,您需要在后台有一个活动的参与者上下文来定义任何有意义的发件人。
使用Tell(object, IActorRef) 允许您将Sender 设置为您喜欢的任何actor ref,包括模仿另一个actor 或ActorRefs.NoSender,这可以用于减少通过线路发送的有效负载的大小,作为消息sender 不会被序列化。
在某些远程场景中,如果您不希望将答案发送到 Sender,使用 actorRef.Tell(msg, ActorRefs.NoSender) 可能会带来不错的性能优势。
为什么? IActorRef 被序列化为 URI 字符串(例如:akka.tcp://system-name@localhost:9001/user/parent/child)。当您发送小消息时,例如股票价格变动或游戏角色位置变化,这可能意味着您的有效负载中最昂贵的部分实际上是发件人。
反序列化IActorRef 也需要一些额外的时间,因为参与者提供者需要为它解析正确的消息传输。
出于这些原因,如果您不需要Sender,使用ActorRefs.NoSender 可能是一个有效的选项。
【讨论】: