Akka vs Java 7期货

时间:2015-06-04 15:59:40

标签: java concurrency akka future

我想了解何时使用Akka Futures并发现this article比主要的Akka文档更有帮助。因此看起来Akka Futures与Java 7 Futures完全相同。所以我问:

  • 在演员系统的背景下,Akka Futures对Java Futures有什么好处?什么时候使用?
  • 在演员系统的背景下,为什么永远使用Akka Future? Aren所有actor-to-actor消息都是异步,并发和非阻塞的?

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

对于你问题的第一部分,我同意阿列克谢·凯戈罗多夫的回答。

对于问题的第二部分:

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