2011-01-04 21 views
13

Estoy retocando con Akka y necesito algunos consejos sobre cómo implementar algo específico que tengo en mente. Quiero tener un actor que pueda enviar un mensaje DownloadFile(URI, File) y descargarlo. Dado que esto puede ser en paralelo, no quiero descargar un archivo tras otro, pero tengo un límite de descargas simultáneas.Actores Akka: necesito un ejemplo para comprender algunos conceptos básicos

¿Cuál es la forma prevista de modelar algo como esto con Akka? Otras cosas que se me ocurren son: ¿Qué sucede si uno de los actores "trabajadores" muere por alguna razón? ¿Cómo reintentar la descarga? Etc. etc.

Sé que esta es una gran pregunta, pero espero que alguien se tome el tiempo para responderla! ¡Gracias!

Respuesta

22

Dale una oportunidad; crea tres, pero puede configurarlo para crear todos los que desee, descargadores, de modo que se puedan procesar simultáneamente tres solicitudes de descarga.

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

crear una clase DownloadActor que gestiona las descargas, Han recibido todos los DownloadActors compartir el mismo Dispatcher, Configurar el despachador de acuerdo a sus necesidades (hilos num máximo, tamaño de la cola, etc), tener todas DownloadActors relacionado con el mismo supervisor, Configure el supervisor según sus necesidades (probablemente OneForOneStrategy), Cree un nuevo DownloadActor para cada nuevo Descargue o use un LoadBalancer con un InfiniteIterator apropiado para distribuir las descargas a los DownloadActors.

Si utiliza AsycHttpClient para descargar los archivos, es compatible con la descarga-reanudación.

Cuestiones relacionadas