Akka vs Java 7 期货

Akka vs Java 7 Futures

我正在尝试了解何时使用 Akka Futures and found this article to be a little bit more helpful than the main Akka docs. So it looks like Akka Futures do exactly the same thing as Java 7 Futures。所以我问:

A​​kka Futures 实现异步通信方式,而 Java7Futures 实现同步通信方式。是的,他们做同样的事情——沟通——但方式完全不同。

生产者-消费者对可以通过两种方式进行交互:同步和异步。同步方式假定消费者有自己的线程并执行阻塞操作以获取下一个生成的消息,例如BlockingQueue.take()。在异步方法中,消费者不拥有线程,它只是一个至少具有两种方法的对象:存储消息和处理消息。 Producer调用store方法,就像同步方式调用Queue.put(m)一样,但是这个方法也是在一个普通的线程池上发起执行consumer的处理方法。

UPDT 至于第二个问题(为什么要使用 Akka Future): Future 的创建看起来(并且)比 Actor 的更简单; Futures 链的代码比 Actors 的代码更紧凑,更可证明。 但是请注意,Future 只能传递单个值(消息),而 Actor 可以处理一系列消息。但是序列可以用 Akka Streams 来处理。所以问题出现了:为什么要使用 Akka Actors?我请更多有经验的开发人员来回答这个问题。一般来说,我认为如果你的任务可以用 Futures 解决,那就用 Futures,否则如果用 Streams,就用 Streams,如果用 Akka Actors,就用 Actors,否则寻找其他框架。

对于你问题的第一部分,我同意 Alexei Kaigorodov 的回答。

对于你问题的第二部分:

当演员响应需要以非常具体的方式组合时,在内部使用 Future 很有用。例如,假设 Master 参与者需要执行多个阻塞数据库查询,然后聚合它们的结果,因此 Master 将每个查询发送到 Worker,然后聚合响应。如果查询结果可以按任何顺序聚合(例如 Master 只是汇总行数或其他),那么 Worker 通过回调将其结果发送到 Master 是有意义的。但是,如果结果需要以非常特定的顺序组合,那么每个 Worker 立即 return 一个 FutureMaster 然后进行操作会更容易这些 Futures 的顺序正确。这也可以通过回调来完成,但是 Master 需要弄清楚哪个查询结果是哪个以将它们按正确的顺序排列,并且优化代码将更加困难(例如,如果结果query1 可以立即与 query2 的结果聚合,然后通过使用 Future 这个逻辑可以直接进入调度代码,其中所有查询的身份都是已知的,而使用回调将需要 Master识别查询结果并确定它是否可以将查询与任何其他已 returned 的查询结果聚合。