AKKA Schauspieler-und Datenbank-Betrieb
Ich versuche, herauszufinden, wie man am besten behandeln, Datenbank-Operationen, die bei Verwendung des Akteur-system. in der Tat-Datenbank-Operationen blockiert werden, während wir versuchen, nicht zu blockieren, in AKKA.
Ich red in der main-doc, dass ein Weg, damit umzugehen war, um eine zu erstellen einen pool von Akteuren, die hinter einem router möglicherweise auf eine getrennte executionContext, wäre das handle der Datenbank zugreifen.
Deshalb habe ich folgende Fragen:
1 - Hat die databaseActors, um die Verbindung zu öffnen, die alle Zeit?
2 - Wie funktioniert es zusammen mit Verbindungs-Pooling als von vielen angeboten-Datenbank?
3 - Sollen wir beides miteinander verbinden, und haben die DatabaseActors Anfrage eine neue Verbindung aus dem pool, jedes mal sind Sie gefragt. Wenn nicht, ist es nicht halten, eine Verbindung zu öffnen, zu jeder Zeit, eine schlechte Sache zu tun?
4 - Kann mir jemand erklären die subtile Sache, die es machen, ein Ansatz, der die Vermeidung thread blockieren. Zum Beispiel mit Spielen oder spray, die Bearbeitung einer Anfrage ist eine asynchrone Aufgabe, aber wenn die Aufgabe eine Datenbank zugreifen, und wir senden Ihnen eine Frage zu dem DatabaseActor, stellt den block auf die Datenbank von Schauspieler (wenn es Auftritt) nicht dazu bewegen, einen block in der asynchronen Aufgabe, was zu einem möglichen thread blockieren ?
5 - Ist es 100% sicher, dass der DB-SÄURE-Eigenschaft sorgt für die Sicherheit der mehrere Lesen und schreiben und deshalb kommt vor der Beziehung.
6 - ich bin mit der semantischen Datenbank auch als triple store und machen Sie schwer mit der semantischen Argumentation-Fähigkeit während meiner Anfrage. Ich führe viele schreib-Zugriff, jede beraten, über tuning-Parameter zu bündeln und Schauspieler zahlen oder speziellen Ausführungskontext?
Besten,
M
Du musst angemeldet sein, um einen Kommentar abzugeben.
Akka Akteure sind stateful D. H., Sie können sicher speichern eines Zustands (in diesem Fall DB-Verbindungs -) innen, Schauspieler zu werden. Sie können entweder schreiben Sie selbst eine Verbindung management-Logik oder verwenden Sie den, ist vorgesehen, die Datenbank-Treiber.
Können Sie beides kombinieren. Haben Sie einen Schauspieler für jede Verbindung in den pool. Warum denken Sie, dass eine Verbindung am Leben ist eine schlechte Sache? Ist nicht der ganze Punkt, der mit einem Verbindungs-pool ist die Wiederverwendung von Ressourcen (verbindungen) und nicht den Preis zahlen, erstellen/zerstören Sie jedes mal.
Wenn Ihr Datenbank-Treiber blockiert dann schließlich blockieren auch. Der Praxis wird empfohlen, führen Sie diese blockieren Stück code in einem separaten Kontext für die Ausführung/thread Pools. Oder wenn Sie die option wählen Sie einen datenspeicher aus, der hat eine reaktive Datenbank-Treiber (z.B., ReactiveMongo für MongoDB), die ist komplett async und non-blocking.
Ich verstehe nicht, was Sie damit meinen.
Sollten Sie auf jeden Fall verwenden Sie einen anderen Ausführungskontext. Das drehen der Parameter hängt wirklich davon ab, Ihre hardware-Konfiguration und andere Besonderheiten Ihrer software (der Typ der Datenbank, remote-db-vs embedded db, Anfragen/Sekunde etc).
Ich glaube nicht, dass es ein one size fits all, wenn es kommt zu Akka Disponenten. Es ist mehr eine Kunst. Meine einzige Empfehlung ist, dass, stellen Sie sicher, Sie sind nicht Sperrung überall in Ihre code.
In diesem blog-post hat einige wirklich gute Punkte, warum nicht verwenden Schauspieler, der pro DB-Verbindung.
Insbesondere, es bedeutet, dass Sie brauchen, um zu verwalten die concurrency-level, statt der systemeigenen Verbindungs-pool zu handhaben ist es für Sie.
Es kann auch in die Irre führen zu denken, Ihr code, der parallel ausgeführt wird, während in der Tat, Ihr code wird Seriell ausgeführt.