我读完Jamie Allen写的Effective Akka书。我对阿卡很新,我真的不明白为什么在某些时候他说:
然而,有一些事情并不理想。 首先,它正在使用期货向其他参与者寻求回应, 它为后面发送的每条消息创建一个新的PromiseActorRef 场景。这是浪费资源。我们会更好 演员以“火与难忘”的方式发送消息并收集结果 异步进入一个演员。
使用Ask而不是Tell似乎通常更昂贵。使用Pull而不是Push会有多贵?而且,与Ask相比,为什么Tell通常更可取?
答案 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
,那么您就浪费了资源。如果您不关心响应,那么为什么要浪费开销(或资源)使系统返回响应。