我正在学习Akka,在探索API时,我遇到了一些好奇的东西(至少对我而言)。 tell
函数直接在ActorRef类上定义。但是,ask
函数在AskSupport特性中声明。我想不出为什么他们需要AskSupport
的单独特征而不是在ActorRef的API(以及ScalaActorRef的API中的ask
)中包含?
的任何理由。有人会关心这背后的推理吗?
答案 0 :(得分:4)
根据Akka Docs:
使用
ask
会产生性能影响 需要跟踪它何时超时,需要有一些东西 将Promise
桥接到ActorRef
并且它也需要 通过远程访问可达到。所以总是更喜欢tell
来表现, 如果必须的话,只有ask
。
鉴于此,您需要通过要求用户明确导入设施来巧妙地阻止使用ask
。这有助于减少ActorRef
API中的膨胀。
答案 1 :(得分:4)
Actor文档给出了作者的推理:
问题模式涉及演员和期货,因此它作为使用模式而不是ActorRef上的方法提供
ask模式包括Future扩展,而不仅仅是ActorRef扩展。特别是,如果您浏览akka.pattern文档,除了Akka对象的扩展之外,您还会注意到PipeToSupport
和PipeableFuture
。
答案 2 :(得分:2)
请记住,Akka基于演员的Erlang系统,我相信tell
是该系统中演员之间唯一的通信工具。我想Akka的家伙想要让Akka中的ActorRef
尽可能与它的Erlang模拟相似。
要记住的另一件事是ask
只是使用tell
然后设置Future
和临时演员来处理响应tell
的模式使它看起来像一个本机请求/响应过程。但在引擎盖下,它实际上只是两个演员来回传递。这是使用tell
来创建请求/响应的外观的惯例,这就是为什么它被设置为Akka中的模式,可以在需要时将其拉入而不是ActorRef
的一部分。< / p>