2011-01-04 4 views
13

저는 Akka를 고치기 위해 염두에두고있는 것을 구현하는 방법에 대한 조언이 필요합니다. 나는 DownloadFile(URI, File) 메시지를 보내고 다운로드 할 수있는 배우를 갖고 싶습니다. 이것은 병렬화 될 수 있기 때문에 파일 이후에 파일을 다운로드하고 싶지는 않지만 동시 다운로드 수는 제한됩니다.Akka 배우 : 몇 가지 기본 사항을 이해하는 예제가 필요합니다.

Akka를 사용하여 이와 같은 모델을 만드는 방법은 무엇입니까? 마음에 오는 다른 것들은 다음과 같습니다. "노동자"배우 중 하나가 어떤 이유로 죽으면 어떻게됩니까? 다운로드를 다시 시도하는 방법은 무엇입니까? 기타 등등.

나는 이것이 매우 거대한 질문 인 것을 알고있다. 그러나 나는 누군가가 그것에 대답하기 위해 시간이 걸리기를 바란다! 고맙습니다!

답변

22

사진을주세요. 3 가지를 만들지 만, 원하는만큼 많은 것을 생성하도록 구성 할 수 있습니다 - 다운로더는 3 가지 다운로드 요청을 동시에 처리 할 수 ​​있습니다.

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

이 다운로드를 관리하는 DownloadActor 클래스를 작성, 모든 DownloadActors이 같은 Dispatcher를 공유 한 구성 운영자가 사용자의 필요에 따라 (최대 NUM 스레드, 큐 크기 등)을, 모든 DownloadActors이 같은 관리자에 연결 한, 필요에 따라 관리자를 구성하십시오 (아마도 OneForOneStrategy). 새로운 Download마다 새로운 DownloadActor를 만들거나 적절한 InfiniteIterator가있는 LoadBalancer를 사용하여 다운로드를 DownloadActors에 배포하십시오.

AsycHttpClient를 사용하여 파일을 다운로드하면 다운로드 다시 시작을 지원합니다.