ActorSelection与ActorRef - 从actorFor迁移到actorSelection

时间:2014-07-18 22:03:22

标签: scala akka

Akka已弃用actorFor而赞成actorSelection。前者返回ActorRef,而后者返回ActorSelection,可以是ActorRef s的集合。

actorFor迁移到actorSelection时,您有几个optoins:

选项1:ActorSelectionActorRef都有tell方法,因此您几乎可以为actorSelection交换actorFor(这并非总是如此 - ask不一样,actorSelection可以指向多个ActorRef s,只要该选择只有一个actor,而你只是tell个actor。

选项2:从ActorRef获取ActorSelection。这可以使用Identify(包含更多邮件)或resolveOne(包含Future)来完成。

在选项1中,与ActorSelection中的ActorRef相比,actorFor添加了哪种开销?

有没有比上面列出的更好的选择?

2 个答案:

答案 0 :(得分:5)

使用ActorSelectionActorRef之间存在开销,具体为:

  

它不像ActorRef那样高效,因为它必须遍历   路径中的演员的层次结构。如果使用远程发送actor   选择遍历不太可能成为瓶颈,但你必须这样做   验证您的具体用途。我们优化了ActorSelection   2.3.x,因此当您更新到该版本时会更快。

来自:Akka用户列表中的Post by Patrik Nordwall

答案 1 :(得分:0)

在选项1中,开销是将消息发送给多个actor而不是一个。如果您使用通配符,则actor系统必须识别与actor选择字符串匹配的所有actor(其中一些可能是远程的),因此这可能最终比仅向一个特定actor发送消息慢。

但是,只要您不在actorSelection使用通配符,ActorSelection对象最多只能引用一个角色。

如果您想使用ask模式,则必须首先使用ActorRef消息获取Identify - 选项2没有更好的方式。