Akka aktorzy: potrzeba przykładu, aby zrozumieć pewne podstawy
Majstruję przy akce i potrzebuję porady, jak wdrożyć coś konkretnego, co mam na myśli. Chcę mieć aktora, którego mogę wysłać DownloadFile(URI, File)
wiadomość i ją ściągnąć. Ponieważ może to być równoległe, nie chcę pobierać plików po plikach, ale mam limit jednoczesnych pobrań.
Jaki jest zamierzony sposób modelowania czegoś takiego z Akką? Inne rzeczy, które przychodzą na myśl to: co się stanie, jeśli jeden z" robotnik " aktor umiera z jakiegoś powodu? Jak ponowić pobieranie? Itd. itd.
Wiem, że to bardzo ważne pytanie, ale mam nadzieję, że ktoś znajdzie czas, aby na nie odpowiedzieć! Dziękuję!
2 answers
Daj temu szansę; tworzy trzy - ale można go skonfigurować tak, aby tworzyć tyle, ile chcesz-downloadery, tak, że trzy żądania pobierania mogą być przetwarzane współbieżnie.
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])
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-13 20:07:53
Utwórz klasę DownloadActor, która zarządza pobieranymi plikami, Czy wszystkie osoby pobierające mają ten sam Dyspozytor, Skonfiguruj dyspozytora zgodnie z Twoimi potrzebami (Maksymalna liczba wątków, rozmiar kolejki itp), Czy wszystkie osoby pobierające są połączone z tym samym przełożonym, Skonfiguruj przełożonego zgodnie z własnymi potrzebami (prawdopodobnie jednym z), Utwórz nowy DownloadActor dla każdego nowego pobrania lub użyj LoadBalancer z odpowiednim InfiniteIterator do dystrybucji pobrań do Do pobrania.
Jeśli używasz AsycHttpClient do pobierania plików, obsługuje on download-resume.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-04 16:06:38