如何与Akka演员一起解决这个问题?

如何与Akka演员一起解决这个问题?,akka,reactive-programming,Akka,Reactive Programming,不知道如何命名此线程,但将尝试用几行文字解释此问题 我有一个命令,需要计算所需日期范围的价格。为了计算it系统,需要单独获取每天的价格(DB、配置、缓存,从哪里开始并不重要) 我的建议是有一个PriceRangeActor,它将有一个DailyPriceActors池,并将向它们发送CalculateDailyPrice之类的命令 但是如何在PriceRanceActor中组装所有这些数据呢 一,。 有一些复杂的钥匙大地图只是闻了很多。那么,如何确定该范围是否已完全计算?有没有更简单的方法 二,

不知道如何命名此线程,但将尝试用几行文字解释此问题

我有一个命令,需要计算所需日期范围的价格。为了计算it系统,需要单独获取每天的价格(DB、配置、缓存,从哪里开始并不重要)

我的建议是有一个PriceRangeActor,它将有一个DailyPriceActors池,并将向它们发送CalculateDailyPrice之类的命令

但是如何在PriceRanceActor中组装所有这些数据呢

一,。 有一些复杂的钥匙大地图只是闻了很多。那么,如何确定该范围是否已完全计算?有没有更简单的方法

二,。
为每个命令创建新的PriceRangeActor,并使用ask模式查询DailyPriceActors的列表?

因为您没有使用任何消息传递/队列,我建议使用Futures而不是Actors作为并发抽象机制。这就提出了一个非常有说服力的论点,即参与者代表国家,未来代表计算

使用Futures或Actor
(这是一个Future),您可以使用将所有单独的查询Futures捆绑到一个Future中,该Future仅在所有子查询完成后才完成

使用期货(推荐)

使用演员

import scala.concurrent.Future
import akka.actor.{Actor, ActorSystem, Props}
import akka.pattern.ask
import akka.util.Timeout

object Foo extends App {          
  type Date = Int
  type Prices = Seq[Float]
  type PriceMap = Map[Date, Prices]

  def fetchPrices(date : Date) : Prices = ???

  val datesToQuery : Seq[Date] = ???

  class QueryActor() extends Actor {
    def receive = { case date : Date => sender ! fetchPrices(date) }
  }

  implicit val as = ActorSystem()
  implicit val queryTimeout = Timeout(1000)

  import as.dispatcher

  def concurrentQuery(date : Date) : Future[Prices] =    
    ask(as actorOf Props[QueryActor],date).mapTo[Prices]

  val dates2PricesFuture : Future[PriceMap] = 
        Future.sequence(datesToQuery map concurrentQuery)
              .map(datesToQuery zip _)  
              .map(_.toMap)

  dates2PricesFuture onSuccess ... //same as first example

}//end object Foo

我会选择第二种选择。在这种情况下,未来的合成要比显式的消息交换容易得多。为什么不创建一个参与者链,每个参与者都有每日价格,然后你沿着这个链传递消息,每个参与者添加到结果中,最后一个参与者-返回给发送者:-)可能取决于范围有多大。Thx伙计们@但是那样的话,我就失去了并行计算的可能性。它看起来类似于《有效阿克卡》一书中所解决的问题。基本上调用N个服务并在它们都准备好时聚合结果。我认为值得一看。
import scala.concurrent.Future
import akka.actor.{Actor, ActorSystem, Props}
import akka.pattern.ask
import akka.util.Timeout

object Foo extends App {          
  type Date = Int
  type Prices = Seq[Float]
  type PriceMap = Map[Date, Prices]

  def fetchPrices(date : Date) : Prices = ???

  val datesToQuery : Seq[Date] = ???

  class QueryActor() extends Actor {
    def receive = { case date : Date => sender ! fetchPrices(date) }
  }

  implicit val as = ActorSystem()
  implicit val queryTimeout = Timeout(1000)

  import as.dispatcher

  def concurrentQuery(date : Date) : Future[Prices] =    
    ask(as actorOf Props[QueryActor],date).mapTo[Prices]

  val dates2PricesFuture : Future[PriceMap] = 
        Future.sequence(datesToQuery map concurrentQuery)
              .map(datesToQuery zip _)  
              .map(_.toMap)

  dates2PricesFuture onSuccess ... //same as first example

}//end object Foo