Akka Actores: ¿Necesita un ejemplo para entender algunos conceptos básicos
-
15-10-2019 - |
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!
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.