Akka:Ask vs Tell

时间:2015-12-22 22:39:54

标签: akka

我读完Jamie Allen写的Effective Akka书。我对阿卡很新,我真的不明白为什么在某些时候他说:

  

然而,有一些事情并不理想。   首先,它正在使用期货向其他参与者寻求回应,   它为后面发送的每条消息创建一个新的PromiseActorRef   场景。这是浪费资源。我们会更好   演员以“火与难忘”的方式发送消息并收集结果   异步进入一个演员。

使用Ask而不是Tell似乎通常更昂贵。使用Pull而不是Push会有多贵?而且,与Ask相比,为什么Tell通常更可取?

2 个答案:

答案 0 :(得分:5)

我是Effective Akka的作者。关于使用Ask的观点是你使用的是Future。如果将多个Asks聚合到一个响应中,则会为Ask后面的每个Future创建多个超时。在小剂量下,这不是一个非常大的交易,但在大的情况下,它会增加对性能的额外拖累。

请注意,本书是在2013年编写的,虽然大部分内容仍然具有相关性,但Akka Streams和Reactive Streams的背压方法已经否定了关于推拉之间选择的一些讨论。在生产者或消费者可能不堪重负的任何情况下,Akka Streams绝对是一种更好的方法。

感谢您阅读本书,我希望您觉得它有用!

答案 1 :(得分:2)

首选使用tell,因为:

  

没有阻止等待消息。这提供了最佳的并发性和可伸缩性特征。

     

使用ask会影响性能,因为需要一些东西   为了跟踪它何时超时,需要有一些东西   将Promise连接到ActorRef,它也需要可以访问   通过远程处理。所以总是喜欢告诉性能,只询问   如果你必须。 http://doc.akka.io/docs/akka/2.4.1/java/untyped-actors.html#Send_messages

如果您在可能使用ask的地方使用tell,那么您就浪费了资源。如果您不关心响应,那么为什么要浪费开销(或资源)使系统返回响应。