2015-11-13 23 views
5

Ostatnio badałem wspaniały układ Akka, aby spróbować go poczuć i zdecydować, czy będzie on odpowiedni dla mojego projektu. Obecnie ta aplikacja jest zwykłą starą aplikacją java, która wykonuje bardzo skomplikowane obliczenia, wykonując połączenia z różnymi zewnętrznymi plikami wykonywalnymi C++ (czasami wykonanie obliczeń może potrwać kilka godzin). W kodzie mogłoby to wyglądać mniej więcej tak: moje pytanie brzmi: czy Akka może poradzić aktorom, którzy czasami zabierają godziny, by wrócić do egzekucji?Wzorzec aktora z Akka i długimi procesami

+1

można skonfigurować dyspozytora, który jest odpowiednim modelem dla twojej aplikacji. Prawdopodobnie chcesz skonfigurować osobną pulę wątków dla dyspozytora, który wykonuje wolne zadania i pozostawić domyślny program rozsyłający dla innych aktorów wykonujących krótkie zadania. http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html Warto przeczytać wszystkie dokumenty, gdy przychodzi do tak bogatej struktury, aby uzyskać wiedzę na temat wszystkich konfigurowalnych części. – simbo1905

+0

OK, to ma sens. Sądzę, że martwię się, że Akka ma jakiś limit czasu lub jakąś inną cechę, która po upływie pewnej ilości czasu sprawi, że aktor zginie. –

+0

Z mojego doświadczenia wynika, że ​​praca po prostu gromadzi się w skrzynkach pocztowych aktorów, dopóki nie zabraknie sterty lub wątków. Więc zarządzanie zasobami jest czymś, co musisz zaprojektować w innym konfiguratorze. Proste rzeczy są proste, złożone rzeczy są możliwe. Moja najlepsza rada to nie robienie wszystkiego aktorem. Futures są także twoimi przyjaciółmi i używają tylko aktorów, aby ułatwić wielozadaniowość i zdalne uruchamianie. – simbo1905

Odpowiedz

2

Bezpośrednia odpowiedź na twoje pytanie; znajduje się na tym samym good article tematu:

Ponownie, jeśli długo działa obliczenia, mając je uruchomić w oddzielnym ExecutionContext dla zadań wykonywanych przez procesor związana jest dobrym pomysłem.

Wyrób ma następujący przykład:

import java.util.concurrent.Executors 
import concurrent.ExecutionContext 

//I added 'private' for the rest of the example 
private val executorService = Executors.newFixedThreadPool(4) 
private val executionContext = ExecutionContext.fromExecutorService(executorService) 

Odpowiadając pośrednio,

Futures First

I całkowicie zgadzam się, że Akka Aktorzy są bardzo użytecznym narzędziem dla poszczególnych rodzajów praca. Jeśli chodzi o buforowanie, najlepszą grą w mieście są: & .

Jednak w tym przypadku proponuję użyć efektu Future zamiast aktora. Możesz wykonać funkcję VeryLongProcess na private. Prywatność pozwoliłoby pełną kontrolę nad liczbą wątków wywołanie metody naraz:

def longProcessFut(start : Int, noOfElements : Int) : Future[Result] = Future { 
    veryLongProcess(start, noOfElements) 
}(executionContext)//controls the executing pool of veryLongProcess 

proste, zwięzłe i asynchronicznym.

Bez zabijania liter, bez przeładowanej metody odbioru, która akceptuje wszystko pod słońcem, ani rekwizyty, nawet ActorRef nie było konieczne dla przyszłości. Pływak, brzuch piwa, mówię!

Poza tym, twój użytkownik zamierza stworzyć przyszłość bez względu na to, co z powodu ?:

//Actor user code, too verbose 

val longProcessRef = actorSystem actorOf Props[Worker] 

val fut : Future[Result] = (longProcessRef ? Work(0,42)).mapTo[Result] 

porównaniu bezpośrednio

//happy user code 

val fut : Future[Result] = longProcessFut(0, 42) 

samą wielką przyszłość za pomocą Futures, ale połowa kalorii!

Możesz kontrolować dyspozytora Przyszłości w ten sam sposób, co sugerowane w komentarzach, które są całkiem dobre. Możesz nawet użyć actorSystem.dispatcher jako swojego przyszłego programu rozsyłającego, aby kontrolować zachowanie dyspozytora.

+0

Dzięki za niesamowitą i dokładną odpowiedź! Pozostaje tylko jedno pytanie: czy nadal możesz mieć dostęp do modułu zdalnego dostępu do Akki z wykorzystaniem kontraktów Futures? Będziemy obciążać system dużym obciążeniem, a celem jest rozłożenie tych obliczeń na liczbę n komputerów. –

+0

Nie zdaję sobie sprawy z jakiejkolwiek funkcjonalności zdalnej obsługi Futures, więc Aktorzy nadal mają tę przewagę. Jednak gdy osobiście wykonuję obliczenia rozproszone, używam Apache Spark lub Akka Streams (nie bezpośrednio Aktorów). –