Akka Actors: нужен пример, чтобы понять некоторые основы - PullRequest
15 голосов
/ 04 января 2011

Я работаю с Akka и мне нужен совет, как реализовать что-то конкретное, что я имею в виду.Я хочу иметь актера, которому я могу отправить сообщение DownloadFile(URI, File) и загрузить его.Поскольку это может выполняться параллельно, я не хочу загружать файл за файлом, но у меня есть ограничение на количество одновременных загрузок.

Каков предполагаемый способ моделирования чего-либо подобного с помощью Akka?Другие вещи, которые приходят на ум: что происходит, если один из «рабочих» актеров по какой-то причине умирает?Как повторить загрузку?И т.д. и т.п.

Я знаю, что это очень большой вопрос, но я надеюсь, что кто-то найдет время, чтобы ответить на него!Спасибо!

Ответы [ 2 ]

24 голосов
/ 05 января 2011

Дайте этому шанс; он создает три, но вы можете настроить его так, чтобы создавать столько загрузчиков, сколько вам нужно, чтобы три запроса на загрузку могли обрабатываться одновременно.

sealed trait DownloaderMessage
case class DownloadFile(uri: URI, file: File) extends DownloaderMessage

object Downloader {
  val dispatcher = Dispatchers.newExecutorBasedEventDrivenWorkStealingDispatcher("pool").build
}

class Downloader extends Actor {
  self.lifeCycle = Permanent
  self.dispatcher = Downloader.dispatcher
  def receive = {
    case DownloadFile(uri, file) =>
      // do the download
  }
}

trait CyclicLoadBalancing extends LoadBalancer { this: Actor =>
  val downloaders: List[ActorRef]
  val seq = new CyclicIterator[ActorRef](downloaders)
}

trait DownloadManager extends Actor {
  self.lifeCycle = Permanent
  self.faultHandler = OneForOneStrategy(List(classOf[Exception]), 5, 5000)
  val downloaders: List[ActorRef]
  override def preStart = downloaders foreach { self.startLink(_) }
  override def postStop = self.shutdownLinkedActors()
}

class DownloadService extends DownloadManager with CyclicLoadBalancing {
  val downloaders = List.fill(3)(Actor.actorOf[Downloader])
}
8 голосов
/ 04 января 2011

Создайте класс DownloadActor, который управляет загрузками, Пусть все DownloadActors используют один и тот же Dispatcher, Настройте Диспетчер в соответствии с вашими потребностями (максимальное количество потоков, размер очереди и т. Д.), Все DownloadActors связаны с одним и тем же супервизором, Настройте Supervisor в соответствии с вашими потребностями (возможно, OneForOneStrategy), Создайте новый DownloadActor для каждой новой загрузки или используйте LoadBalancer с соответствующим InfiniteIterator для распространения загрузок среди DownloadActors.

Если вы используете AsycHttpClient для загрузки файлов, он поддерживает возобновление загрузки.

...