为什么不直接在ActorRef上为Akka定义?

时间:2014-01-02 03:22:51

标签: scala akka

我正在学习Akka,在探索API时,我遇到了一些好奇的东西(至少对我而言)。 tell函数直接在ActorRef类上定义。但是,ask函数在AskSupport特性中声明。我想不出为什么他们需要AskSupport的单独特征而不是在ActorRef的API(以及ScalaActorRef的API中的ask)中包含?的任何理由。有人会关心这背后的推理吗?

3 个答案:

答案 0 :(得分:4)

根据Akka Docs

  

使用ask会产生性能影响   需要跟踪它何时超时,需要有一些东西   将Promise桥接到ActorRef并且它也需要   通过远程访问可达到。所以总是更喜欢tell来表现,   如果必须的话,只有ask

鉴于此,您需要通过要求用户明确导入设施来巧妙地阻止使用ask。这有助于减少ActorRef API中的膨胀。

答案 1 :(得分:4)

Actor文档给出了作者的推理:

  

问题模式涉及演员和期货,因此它作为使用模式而不是ActorRef上的方法提供

ask模式包括Future扩展,而不仅仅是ActorRef扩展。特别是,如果您浏览akka.pattern文档,除了Akka对象的扩展之外,您还会注意到PipeToSupportPipeableFuture

答案 2 :(得分:2)

请记住,Akka基于演员的Erlang系统,我相信tell是该系统中演员之间唯一的通信工具。我想Akka的家伙想要让Akka中的ActorRef尽可能与它的Erlang模拟相似。

要记住的另一件事是ask只是使用tell然后设置Future和临时演员来处理响应tell的模式使它看起来像一个本机请求/响应过程。但在引擎盖下,它实际上只是两个演员来回传递。这是使用tell来创建请求/响应的外观的惯例,这就是为什么它被设置为Akka中的模式,可以在需要时将其拉入而不是ActorRef的一部分。< / p>