Akka Attori: hanno bisogno di un esempio per capire alcuni principi fondamentali
-
15-10-2019 - |
Domanda
Sono armeggiare con Akka e hanno bisogno di qualche consiglio su come implementare qualcosa di specifico che ho in mente. Voglio avere un attore che posso inviare un messaggio DownloadFile(URI, File)
e lo scarica. Dal momento che questo può essere di pari passo, non voglio per il download di file dopo file, ma hanno un limite di download simultanei.
Che cosa è il modo in cui il modello di qualcosa di simile con Akka destinati? Altre cose che vengono in mente sono: Cosa succede se uno dei "lavoratori" muore attore per qualche motivo? Come riprovare il download? Ecc ecc.
So che questa è una domanda molto grande, ma spero che qualcuno si prende il tempo di rispondere! Grazie!
Soluzione
Dare a questo un colpo; crea tre - ma si potrebbe configurare per creare come molti come ti piace -. downloader, in modo che tre richieste di download potranno essere trattati 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])
}
Altri suggerimenti
Creare una classe DownloadActor che gestisce i download, Hanno tutti DownloadActors condividono lo stesso Dispatcher, Configurazione del Dispatcher base alle proprie esigenze (fili max num, dimensione della coda, ecc), Avere tutti i DownloadActors legati alla stessa Supervisor, Configurare il garante in base alle proprie esigenze (probabilmente OneForOneStrategy), Creare un nuovo DownloadActor per ogni nuovo download o utilizzare un LoadBalancer con un'InfiniteIterator adeguato per distribuire i download per i DownloadActors.
Se si utilizza AsycHttpClient per scaricare i file, supporta download-curriculum.