2011-01-04 16 views
13

Akka ile uğraşıyorum ve aklımda olan belirli bir şeyin nasıl uygulanacağına dair tavsiyeye ihtiyacım var. DownloadFile(URI, File) mesajını gönderebileceğim bir oyuncuya sahip olmak istiyorum. Bu paralel olabileceğinden, dosyadan sonra dosya indirmek istemiyorum ancak eşzamanlı indirme sınırı var.Akka Aktörler: Bazı temelleri anlamak için bir örneğe ihtiyacınız var

Akka ile böyle bir şeyi modelleme amacınız nedir? Akla gelen diğer şeyler şunlardır: "İşçi" aktörlerinden biri bir sebepten ötürü ölürse ne olur? İndirme nasıl yeniden denenir? Vb vb.

Bunun çok büyük bir soru olduğunu biliyorum ama umarım birisi cevap vermek için zaman alır! Teşekkür ederim!

cevap

22

Bunu bir şans verin; Üç tane yaratır - ama onu istediğiniz kadar yaratmaya - yani indiricilere - yapılandırabilirsiniz, böylece üç yükleme isteği eşzamanlı olarak işlenebilir.

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

indirmeleri yöneten bir DownloadActor sınıf oluşturmak tüm DownloadActors aynı Dispatcher paylaşan mü, yapılandır Dispatcher ihtiyaçlarınıza göre (maks num parçacığı, kuyruk boyutu vb), tüm DownloadActors aynı Tez bağladınız mı, Süpervizörün gereksinimlerinize göre yapılandırılması (muhtemelen OneForOneStrategy), Her yeni için yeni bir DownloadActor oluşturun İndirilenleri DownloadActor'lara dağıtmak için uygun bir InfiniteIterator içeren bir LoadBalancer'ı indirin veya kullanın.

Dosyaları indirmek için AsycHttpClient kullanıyorsanız, karşıdan yüklemeyi destekler.

İlgili konular