2015-02-17 10 views
15

Ich versuche herauszufinden, wie Datenbankoperationen bei der Verwendung eines Aktorsystems am besten zu handhaben sind. Tatsächlich blockieren Datenbankoperationen, während wir versuchen, in AKKA nicht zu blockieren.AKKA Actor und DataBase Operation

Ich rot in der Hauptdokument, dass eine Möglichkeit, das zu handhaben war, um einen Pool von Akteuren hinter einem Router, möglicherweise auf einem getrennten executionContext, die Datenbankzugriff behandeln würde erstellen.

Deshalb habe ich die folgenden Fragen:

1 - Ist der databaseActors die Verbindung offen hält die ganze Zeit?

2 - Wie funktioniert es zusammen mit dem Verbindungs-Pooling, wie es von vielen Datenbanken angeboten wird?

3 - Sollen wir beides kombinieren und die DatabaseActors eine neue Verbindung aus dem Pool anfordern, jedes Mal wenn sie angefordert werden. Wenn nicht, ist es nicht immer eine offene Verbindung, eine schlechte Sache zu tun?

4 - Kann mir jemand die subtile Sache erklären, die es zu einem Ansatz macht, der Thread-Hunger vermeidet. Zum Beispiel mit Play oder spray, die Behandlung einer Anfrage ist eine asynchrone Aufgabe, aber wenn diese Aufgabe einen Datenbankzugriff benötigt und wir eine Anfrage an den DatabaseActor senden, wird der Block auf der Datenbank Actor (wenn es auftritt) nicht induzieren, ein Block in der asynchronen Task, der zu einem möglichen Thread-Hunger führt?

5 - Ist es zu 100% sicher, dass die DB ACID-Eigenschaft die Sicherheit des Mehrfachlese- und -schreibvorgangs gewährleistet und daher vor der Beziehung stattfindet.

6 - Ich benutze die semantische Datenbank auch Triple-Store genannt und mache schwere Verwendung von semantischen Argumentation Fähigkeit während meiner Anfrage. Ich mache auch eine Menge Schreibzugriff, irgendeinen Ratschlag bezüglich der Abstimmungsparameter von Pooling und Actor-Nummern oder dedizierten Ausführungskontexten?

Best,

M

Antwort

12

1 - Ist die databaseActors die Verbindung offen halten die ganze Zeit?

Akka Schauspieler sind Stateful das heißt, Sie können sicher Speicher Zustand (in diesem Fall DB-Verbindung) innerhalb Schauspieler. Sie können entweder eine eigene Verbindungsverwaltungslogik schreiben oder die von Ihrem Datenbanktreiber bereitgestellte verwenden.

2 - Wie funktioniert es zusammen mit dem Verbindungs-Pooling, wie es von vielen Datenbanken angeboten wird?

3 - Sollen wir beides kombinieren und die DatabaseActors eine neue Verbindung aus dem Pool anfordern, jedes Mal wenn sie angefordert werden. Wenn nicht, ist es nicht immer eine offene Verbindung, eine schlechte Sache zu tun?

Sie können beides kombinieren. Haben Sie einen Schauspieler für jede Verbindung im Pool. Warum denkst du, eine Verbindung lebendig zu haben, ist eine schlechte Sache? Es ist nicht der Sinn eines Verbindungspools, Ressourcen (Verbindungen) wiederzuverwenden und nicht den Preis dafür zu zahlen, dass sie jedes Mal erstellt/zerstört werden.

4 - Kann mir jemand die subtile Sache erklären, die es zu einem Ansatz macht, der Thread-Hunger vermeidet.Zum Beispiel mit Play oder spray, die Behandlung einer Anfrage ist eine asynchrone Aufgabe, aber wenn diese Aufgabe einen Datenbankzugriff benötigt und wir eine Anfrage an den DatabaseActor senden, wird der Block auf der Datenbank Actor (wenn es auftritt) nicht induzieren, ein Block in der asynchronen Task, der zu einem möglichen Thread-Hunger führt?

Wenn Ihr Datenbanktreiber Sie dann schließlich blockiert auch zu blockieren. Die empfohlene Vorgehensweise besteht darin, diesen blockierenden Code in einem separaten Ausführungskontext/Thread-Pool auszuführen. Oder wenn Sie über die Option einen Datenspeicher mit einem reaktiven Datenbanktreiber (z. B. ReactiveMongo für MongoDB) auswählen, der vollständig asynchron und nicht blockierend ist.

5 - Ist es zu 100% sicher, dass die DB ACID-Eigenschaft die Sicherheit des Mehrfachlese- und -schreibvorgangs gewährleistet und daher vor der Beziehung stattfindet.

Ich verstehe nicht, was Sie damit meinen.

6 - Ich benutze die semantische Datenbank auch Triple-Store genannt und benutze die semantische Argumentation während meiner Anfrage. Ich mache auch eine Menge Schreibzugriff, irgendeinen Ratschlag bezüglich der Abstimmungsparameter von Pooling und Actor-Nummern oder dedizierten Ausführungskontexten?

Sie sollten auf jeden Fall einen anderen Ausführungskontext verwenden. Das Drehen von Parametern hängt wirklich von Ihrer Hardwarekonfiguration und anderen Besonderheiten Ihrer Software ab (Dateityp, Remote-DB gegenüber eingebetteter Datenbank, Anfragen/Sekunde usw.).

Ich glaube nicht, dass es eine Einheitsgröße gibt, wenn es um Akka Dispatcher geht. Es ist mehr eine Kunst. Meine einzige Empfehlung ist, dass Sie nicht blockieren irgendwo in Ihren Code.

+0

Vielen Dank für die Klarstellung. – MaatDeamon

0

This blog post hat einige wirklich gute Punkte, warum man nicht Actor per DB-Verbindung verwenden.

Insbesondere bedeutet dies, dass Sie die Nebenläufigkeitsebene verwalten müssen, anstatt den nativen Verbindungspool für Sie verwenden zu lassen. Es kann Sie auch irreführen, dass Ihr Code parallel ausgeführt wird, während Ihr Code tatsächlich seriell ausgeführt wird.