2013-09-22 9 views
8

Właśnie napisałem pulę połączeń JDBC, używając Akka.Kiedy firma Akka osiągnie lepszą wydajność?

Używa aktora do przechowywania kolekcji "maxPoolSize" rzeczywistych połączeń z bazą danych. Osoba dzwoniąca pyta aktora puli o połączenie i odbiera numer Future[Connection], a status połączenia staje się "zajęty", dopóki rozmówca nie zwróci go do puli pod numerem connection.close. Jeśli wszystkie połączenia są zajęte, nowe przychodzące żądanie połączenia zostanie umieszczone w kolejce oczekujących (również przez aktora puli). Później, gdy połączenie zostanie zwrócone, żądanie oczekiwania zostanie spełnione.

Implementacja tej logiki jest bardzo prosta w akka, zaledwie kilkudziesięciu liniach kodu. Jednak podczas korzystania z BoneCP Multithread Test do testowania wydajności (tj rozmówca close połączenie natychmiast, gdy Future[Connection] zwrócony przez getConnection jest spełniony. Benchmark traversed wszystkie żądania close i Await dla wyniku Future), uważam, że wersja Akka jest wolniejszy niż wiele innych implementacji pul połączeń, takich jak tomcat-jdbc, BoneCP czy nawet commons DBCP.

Co Próbowałem do strojenia:

  1. rozłupywania aktor basen na wiele z nich posiadają po części wszystkich rzeczywistych połączeń
  2. szczypanie niektórych parametrów konfiguracyjnych domyślnych-dyspozytor (przepustowość, równoległość)

ale nie zauważyłem żadnej poprawy.

Moje pytanie brzmi:

  1. Czy to odpowiedni przypadek użycia, że ​​za pomocą Akka dostanie lepszą wydajność?
  2. Jeśli tak, to w jaki sposób mogę uzyskać podobne lub lepsze dane porównawcze niż implementacje ręcznej puli połączeń?
  3. Jeśli tak nie jest, dlaczego? Czy istnieją jakieś ustalone kryteria, które mogą mi pomóc zdecydować, kiedy użyć akka?
+5

Nie jestem strasznie zaskoczony. Aby nie wątpić w swoje umiejętności rozwojowe w najmniejszym stopniu, ale te inne biblioteki mają sporo więcej czasu na rozwój, aby rozwiązać ten bardzo specyficzny problem. – joescii

+0

Chciałbym zobaczyć odpowiedzi na punkt # 3! – maasg

+2

Myślę, że # 3 jest dobrze omówione tutaj: http: // stackoverflow.com/questions/4493001/good-use-for-for-akka – Ryan

Odpowiedz

0

Innym podejściem jest utworzenie Router, które spowoduje odrodzenie kilku aktorów niewolniczych, z których każdy reprezentuje pojedyncze połączenie.

Należy jednak pamiętać, że mogą wystąpić potencjalne warunki wyścigu.

Jakiej wersji Scala i Akka używasz?

1

Aby odpowiedzieć na pytanie nr 1, nie jest to przypadek, w którym Akka osiągnie najwyższą prędkość. Zasadniczo podjąłeś problem, który jest zwykle rozwiązywany dzięki współbieżnej strukturze danych zoptymalizowanej pod kątem wielu czytników i pisarzy i serializowanych przez jednego aktora.

-2

Akka może być dobrym wyborem do wysoce równoległych obliczeń, podczas gdy pula połączeń JDBC nie jest dobrym przykładem dla wysoce równoległych obliczeń.

+0

elcome to stackoverflow! Nie zapewnia to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, zostaw komentarz pod swoim postem - zawsze możesz komentować własne posty, a gdy już uzyskasz wystarczającą reputację, będziesz mógł komentować każdy post. Zapoznaj się z wytycznymi dotyczącymi dobrych odpowiedzi: http://stackoverflow.com/questions/how-to-answer. – bitoiu

+0

Nie ma za co. – bitoiu

Powiązane problemy