Akka已弃用actorFor
而赞成actorSelection
。前者返回ActorRef
,而后者返回ActorSelection
,可以是ActorRef
s的集合。
从actorFor
迁移到actorSelection
时,您有几个optoins:
选项1:ActorSelection
和ActorRef
都有tell
方法,因此您几乎可以为actorSelection
交换actorFor
(这并非总是如此 - ask
不一样,actorSelection
可以指向多个ActorRef
s,只要该选择只有一个actor,而你只是tell
个actor。
选项2:从ActorRef
获取ActorSelection
。这可以使用Identify
(包含更多邮件)或resolveOne
(包含Future
)来完成。
在选项1中,与ActorSelection
中的ActorRef
相比,actorFor
添加了哪种开销?
有没有比上面列出的更好的选择?
答案 0 :(得分:5)
使用ActorSelection
与ActorRef
之间存在开销,具体为:
它不像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没有更好的方式。