【问题标题】:Akka: Ask vs TellAkka:询问与告诉
【发布时间】:2016-03-29 07:05:21
【问题描述】:

我读完了 Jamie Allen 的 Effective Akka 书。我对 Akka 还很陌生,我真的不明白为什么他说:

但是,它有一些不理想的地方。 首先,它是使用期货来询问其他参与者的回应, 它为后面发送的每条消息创建一个新的 PromiseActorRef 场景。这是对资源的浪费。最好有我们的 演员以“即发即弃”的方式发送消息并收集结果 异步进入一个actor。

使用 Ask 而不是 Tell 似乎通常更昂贵。使用拉而不是推要贵多少?还有,为什么 Tell 比 Ask 通常更受欢迎?

【问题讨论】:

  • 这就是我想要理解的。为什么他说“这是在浪费资源”?

标签: akka


【解决方案1】:

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

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

感谢您阅读本书,希望对您有所帮助!

【讨论】:

  • 您好 Jamie,谢谢或回答 - 是的,最佳实践部分仍然非常有趣。那么你认为 Extra 模式还有应用吗?
  • 我愿意,但我更喜欢 Cameo 模式。任何时候你在 JVM 上创建了一些匿名的东西,你就失去了推理的能力。 Lambdas、Java 接口的匿名实现等都是类似的。拥有显式类型总是更简洁、更易于维护。此外,当我要呼叫三个或更多时,我喜欢汇总来自多个服务的响应。这让我可以针对可能发生的各种故障情况构建特定于域的行为(3 个响应中的 2 个返回,第三次重试几次,如果不起作用则失败,等等)。谢谢!
【解决方案2】:

最好使用tell,因为:

没有阻塞等待消息。这提供了最佳的并发性和可扩展性特征。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 2018-06-01
    • 2013-08-20
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    相关资源
    最近更新 更多