Pregunta

Estoy jugando con Akka y necesitan algunos consejos de cómo implementar algo específico que tengo en mente. Quiero tener un actor, que puedo enviar un mensaje DownloadFile(URI, File) y lo descarga. Dado que esto puede ser paralelo, yo no quiero archivo de descarga después de archivo, pero tienen un límite de descargas simultáneas.

¿Cuál es la forma de modelo de algo como esto con la intención de Akka? Otras cosas que vienen a la mente son: ¿Qué pasa si uno de los "trabajadores" muere actor por alguna razón? Para intentar realizar la descarga? Etc., etc.

Sé que esto es una pregunta muy enorme, pero espero que alguien se toma el tiempo para responder a ella! Gracias!

¿Fue útil?

Solución

Dar a este un tiro; crea tres - pero se puede configurar para crear tantos como te gusta -. descargadores, de modo que tres solicitudes de descarga podrían ser procesados ??concurrenty

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])
}

Otros consejos

Crea una clase DownloadActor que gestiona las descargas, Tienen todos DownloadActors comparten el mismo Dispatcher, Configurar el despachador de acuerdo a sus necesidades (hilos num máximo, tamaño de la cola, etc), Tener todos los DownloadActors vinculados con el mismo supervisor, Configurar el Supervisor de acuerdo a sus necesidades (probablemente OneForOneStrategy), Crear un nuevo DownloadActor para cada nueva descarga o el uso de un LoadBalancer con un InfiniteIterator apropiada para distribuir las descargas a los DownloadActors.

Si utiliza AsycHttpClient para descargar los archivos, se admite la descarga de reanudación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top