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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top