Akka vs Java 7 Futures

2022-09-03 07:30:20

我试图了解何时使用Akka Futures,并发现本文比主要的Akka文档更有用。所以看起来Akka Futures做的事情与Java 7 Futures完全相同。所以我问:

  • 在参与者系统之外,Akka Futures与Java Futures相比有什么好处?何时使用每种方法?
  • 在演员系统的背景下,为什么要使用阿卡未来?难道不是所有参与者到参与者的消息都是异步的、并发的和非阻塞的吗?

答案 1

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

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

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


答案 2

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

对于问题的第二部分:

当参与者响应需要以非常具体的方式组合时,在内部使用是很有用的。例如,假设参与者需要执行多个阻塞数据库查询,然后聚合其结果,从而将每个查询发送到 a,然后聚合响应。如果查询结果可以按任何顺序聚合(例如 只是对行计数或其他内容求和),然后通过回调将其结果发送到是有意义的。但是,如果需要以非常具体的顺序组合结果,则每个结果都更容易立即返回a,然后以正确的顺序操作它们。这也可以通过回调来完成,但是需要找出哪个查询结果以正确的顺序放置它们,并且优化代码将更加困难(例如,如果query1的结果可以立即与query2的结果聚合,那么通过使用这个逻辑可以直接进入调度代码,其中所有查询的身份都是已知的, 而使用回调需要标识查询结果,并确定它是否可以将查询与已返回的任何其他查询结果聚合)。FutureMasterMasterWorkerMasterWorkerMasterWorkerFutureMasterFuturesMasterFutureMaster


推荐