Wann bringt Akka bessere Leistungen?

9

Ich habe gerade einen JDBC-Verbindungspool mit Akka geschrieben.

Es verwendet einen Akteur, um eine "maxPoolSize" Sammlung von realen Datenbankverbindungen zu halten. Der Anrufer fragt den Pool-Actor nach einer Verbindung und erhält eine Future[Connection] . Der Status der Verbindung wird "busy", bis der Anrufer sie in connection.close an den Pool zurückgibt. Wenn alle Verbindungen besetzt sind, wird die neue eingehende Verbindungsanforderung in eine Warteschlange gestellt (die auch vom Pool-Akteur gehalten wird). Später, wenn eine Verbindung zurückgegeben wird, wird die wartende Anfrage erfüllt.

Die Implementierung dieser Logik ist in akka sehr einfach, nur Dutzende von Codezeilen. Wenn Sie jedoch den BoneCP Multithread-Test verwenden, um die Leistung zu testen (dh der Aufrufer close die Verbindung sofort, wenn Future[Connection] zurückgegeben von getConnection erfüllt ist.Der Benchmark traversed all die close Anfrage und Await für das Ergebnis Future ), Ich fand, dass die Akka-Version ist langsamer als viele andere Connection Pool-Implementierungen wie tomcat-jdbc , BoneCP oder sogar commons DBCP.

Was ich für das Tuning versucht habe:

  1. Aufteilung des Pool-Actors in mehrere, die jeweils einen Teil aller realen Verbindungen enthalten
  2. Feinabstimmung einiger der Standard-Dispatcher-Konfigurationsparameter (Durchsatz, Parallelität)

aber sah keine merkliche Verbesserung.

Meine Frage ist:

  1. Ist dies ein geeigneter Anwendungsfall, dass die Verwendung von akka bessere Leistung bringt?
  2. Wenn ja, wie kann ich ähnliche oder bessere Benchmark-Daten erhalten als diese Implementierungen von Handed-Threading-Connection-Pools?
  3. Wenn nicht, warum? Gibt es bestimmte Kriterien, die mir helfen können, zu entscheiden, wann ich akka verwenden soll?
xiefei 22.09.2013, 03:37
quelle

3 Antworten

2

Um Frage Nr. 1 zu beantworten, ist dies kein Anwendungsfall, bei dem Akka in der Geschwindigkeit überragend ist. Sie haben im Grunde ein Problem gelöst, das normalerweise mit einer gleichzeitigen Datenstruktur gelöst wird, die für mehrere Leser und Schreiber optimiert und durch einen einzigen Akteur serialisiert ist.

    
Björn Antonsson 01.10.2013 13:47
quelle
0

Ein anderer Ansatz besteht darin, einen Router zu erstellen, der jeweils mehrere Slave-Actors hervorbringt eine einzelne Verbindung darstellen.

Aber seien Sie sich bewusst, dass es mögliche Rassenbedingungen geben könnte.

Auch, welche Version von Scala und Akka verwenden Sie?

    
alatar 01.10.2013 10:33
quelle
-1

Akka könnte eine gute Wahl für hochparallele Berechnungen sein, während ein JDBC-Verbindungspool kein gutes Beispiel für hochparallele Berechnungen ist.

    
kocka 11.06.2014 15:41
quelle

Tags und Links