2011-01-04 13 views
13

Tôi đang làm việc với Akka và cần một số lời khuyên làm thế nào để thực hiện điều gì đó cụ thể mà tôi có trong đầu. Tôi muốn có một diễn viên mà tôi có thể gửi tin nhắn DownloadFile(URI, File) và tải xuống. Vì điều này có thể được song song, tôi không muốn tải xuống tệp sau tệp nhưng có giới hạn tải xuống đồng thời.Diễn viên Akka: Cần một ví dụ để hiểu một số khái niệm cơ bản

Làm cách nào để mô hình hóa thứ gì đó như thế này với Akka? Những điều khác cần lưu ý là: Điều gì sẽ xảy ra nếu một trong những diễn viên "công nhân" chết vì một lý do nào đó? Cách thử tải xuống lại? Vv ..

Tôi biết đây là một câu hỏi rất lớn nhưng tôi hy vọng ai đó dành thời gian để trả lời câu hỏi đó! Cảm ơn bạn!

Trả lời

22

Tặng thử ảnh này; nó tạo ra ba - nhưng bạn có thể cấu hình nó để tạo bao nhiêu tùy thích - trình tải xuống, để ba yêu cầu tải xuống có thể được xử lý đồng thời.

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

Tạo một lớp DownloadActor quản lý các tải về, có tất cả DownloadActors chia sẻ Dispatcher cùng, Cấu hình Dispatcher theo yêu cầu của bạn (đề num tối đa, kích thước hàng đợi vv), có tất cả DownloadActors liên quan đến Giám sát cùng, Cấu hình Trình giám sát theo nhu cầu của bạn (có thể là OneForOneStrategy), Tạo một DownloadActor mới cho mỗi Tải xuống mới hoặc sử dụng LoadBalancer với Trình InfiniteIterator thích hợp để phân phối tải xuống cho DownloadActors.

Nếu bạn sử dụng AsycHttpClient để tải xuống các tệp, nó hỗ trợ tải xuống tiếp tục.