我想了解何时使用Akka Futures并发现this article比主要的Akka文档更有帮助。因此看起来Akka Futures与Java 7 Futures完全相同。所以我问:
答案 0 :(得分:7)
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
更容易立即返回Future
和Master
,然后再操作这些{{1}按正确的顺序。这也可以通过回调来完成,但是Futures
需要确定哪个查询结果以正确的顺序放置它们,并且优化代码将会更加困难(例如,如果query1可以立即与query2的结果聚合,然后使用Master
这个逻辑可以直接进入所有查询的身份已知的调度代码,而使用回调需要Future
来识别查询结果,并确定它是否可以将查询与已返回的任何其他查询结果聚合在一起。