2015-06-04 61 views
16

我想了解何时使用Akka Futures,发现this article比主Akka文档更有帮助。因此,看起来Akka Futures与Java 7 Futures完全一样。所以我问:Akka vs Java 7期货

  • 在演员系统的环境之外,Akka期货对Java期货有什么好处?何时使用每个?
  • 在演员系统的背景下,为什么曾使用使用Akka Future?不是所有的actor-to-actor消息都是异步的,并发的和非阻塞的吗?
+0

Akka的'Future'和'Promise'与Java的'CompletableFuture'更具可比性。 –

+0

谢谢@SotiriosDelimanolis,但你可能不认为它是这样,但它确实如此。 – smeeb

回答

7

Akka Futures实现异步通信方式,而Java7 Futures实现同步方式。是的,他们做同样的事情 - 沟通 - 但方式完全不同。

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

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

+0

谢谢@Alexei Kaigorodov(+1) - 我认为这解决了我首先关注的问题,关于在演员系统的上下文之外使用Akka Futures *。如果我理解你是正确的,那么当你需要一个普通的Java 7 Future时,你应该使用它们,但是需要一个* asynchronous * producer/consumer交互。 **但是我的第二个担忧呢?**在演员系统里面使用Akka Futures *怎么样?如果演员对演员的信息已经是异步的,为什么在演员系统中使用Akka Future呢?你会在与外部/阻塞数据库进行通信的actor中使用它们吗?再次感谢! – smeeb

+0

什么使Java 7期货比Akka期货更为同步呢?我不明白。 – flup

4

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

对于你的问题的第二部分:

当演员的反应需要在一个非常特殊的方式来组合这是使用Future内部有用。例如,假设Master参与者需要执行多个阻塞数据库查询,然后汇总其结果,因此Master会将每个查询发送到Worker,然后将聚合响应。如果查询结果可以按任何顺序汇总(例如Master只是计算行数或其他),那么Worker通过回调将结果发送到Master是有意义的。但是,如果结果需要按照特定的顺序进行组合,那么每个Worker立即返回FutureMaster以便按照正确的顺序操作这些Futures更容易。这也可以通过回调来完成,但是然后Master需要找出哪个查询结果是将它们按正确的顺序放入哪个查询结果中,并且要优化代码将是困难得多的。如果查询1的结果可以立即与查询2的结果汇总,那么通过使用Future,该逻辑可以直接进入所有查询的标识已知的调度代码,而使用回调则需要Master来标识查询结果并确定它是否可以将查询与已返回的任何其他查询结果进行聚合)。