© Oleg Krugliak/Shutterstock.com
Reaktive Mandantenfähigkeit mit Neo4j 4.0 und SDN/RX

3 für 1: die Geschichte eines Filmverleihs


Diejenigen Leser, die meine Artikel, Vorträge und Posts seit längerem verfolgen, mögen mir nachsehen, dass ich ein Fan aussterbender Medienformate bin. Nach CDs und Alben jetzt Videos. Die Domäne Videos hat den Vorteil, dass Neo4j mit einem eingebauten Guide kommt, der den sogenannten Movie Graph erstellt. In den Java-Magazin-Ausgaben 7.2019, 8.2019 und 9.2019 habe ich ausführlich beschrieben, wie Neo4j lokal und auf dem Server in Betrieb genommen werden kann.

Seit den genannten Ausgaben beziehungsweise seit dem Schreiben des Tutorials ist einiges an Zeit vergangen und einiges in der Welt der Graphdatenbanken passiert. Im Januar 2020 erschien Neo4j 4.0 mit einigen bedeutenden Neuerungen. Unter dem Titel „Der Fokus liegt auf Performance und Skalierbarkeit“ schrieb ich dazu auf JAXenter [1]. Für diesen Artikel greife ich folgende Themen auf:

  • Multi-Database-Support (aus der Enterprise Edition)

  • reaktive Datenbank, reaktive Treiber und neue Spring-Integration

  • Role-based Access Controls (RBAC) (aus der Enterprise Edition)

Als Bonus werde ich am Ende darlegen, wie mit Neo4j Fabric aus mehreren, verteilten Datenbanken eine gemeinsame Sicht auf Daten, sprich ein gemeinsamer Graph, erstellt werden kann.

Was ist meine Rolle in dieser Geschichte? Ich arbeite zusammen mit meinem Kollegen Gerrit [2] seit dem Frühling 2019 an einer neuen Major-Version der Spring-Data-Integration von Neo4j. Spring Data Neo4j plus Neo4j-OGM, so wie ich es in den vorhergegangenen Artikeln vorgestellt habe, ist eine reifes Produkt, aber aus seiner Historie heraus nicht in der Lage, reaktive Systeme zu bedienen. Gerrit und ich haben zusammen mit den Kollegen aus dem Neo4j-Treiber-Team unsere reaktive Story angetrieben und sind sehr froh darüber. Über den Java-Treiber sind wir in der Lage, zusammen mit dem Spring-Data-Team von Pivotal beziehungsweise VMware Tanzu auch für Neo4j reaktive Repositories anzubieten. Gleichzeitig profitieren auch andere Ökosysteme wie Quarkus und Micronaut davon. Und nicht nur diese, auch intern wird der reaktive Treiber genutzt: Fabric verbindet mit ihm entfernte Datenbanken zu einer einheitlichen Sicht. Doch dazu später mehr.

Im Folgenden werde ich weiterhin das supergeheime Password für Neo4j voraussetzen, das wir auch für Integrationstests in SDN/RX nutzen. Es ist „secret“.

Die Domäne

Neo4j bietet für erste Experimente den Movie Graph über das Browserinterface an. Für dieses Beispiel ist es der schnellste Weg, Daten zu generieren. Der Graph beinhaltet eine Liste von Filmen und Personen, außerdem Beziehungen zwischen den Filmen und Personen sowie den Personen untereinander (ACTED_IN, DIRECTED etc.).

Stellt euch zwei Verleihdienste (Videotheken) vor, die Filme streamen: Videos R Us und Video City. Beide Videotheken sind Mandanten einer größeren Firma, dem Videokingdom. Videokingdom betreibt eine neue Installation von Neo4j 4.0 Enterprise Edition und bietet jedem Mandanten eine eigene Datenbank an. Beide Mandanten benutze eine Streamingapplikation, die ebenfalls durch Videokingdom bereitgestellt wird. Diese Anwendung bietet ein reaktives RESTful Backend und ist hochskalierbar.

Unsere Aufgabe ist es, dass jeder Benutzer dieses Backends als Benutzer eines spezifischen Mandanten identifiziert und jede Interaktion zur richtigen Datenbank geleitet wird.

Vorbereitung der Datenbank

Wir benötigen für unsere Tests eine lokale Neo4j-4.0-Installation. Ihr könnt meinen Beschreibungen aus den eingangs genannten Ausgaben des Java Magazins folgen, um Neo4j lokal in Betrieb zu nehmen. Die aktuelle Serverversion gibt es im Download Center [3], die aktuelle Desktopversion unter [4]. Die Desktopvariante beinhaltet die Enterprise Edition und somit den notwendigen Multi-Database-Support.

Ich gehe im Folgenden von einem Standard-Server-Download aus. Wir navigieren zum bin-Verzeichnis der Installation und starten Neo4j wie folgt:

./bin/neo4j start

Im nächsten Schritt nutzen wir die Cypher Shell [5] für die notwendigen administrativen Aufgaben:

./bin/cypher-shell -u neo4j -p neo4j

Bei der erstmaligen Verbindung wird Neo4j nach einem neuen Passwort fragen. Hier nutzen wir „secret“. Im nächsten Schritt erstellen wir zwei Datenbanken. Dazu müssen wir uns zuerst gegen die system-Datenbank verbinden:

:USE system; CREATE DATABASE `videos-are-us`; CREATE DATABASE `video-city`;

Der erste Befehl wechselt die Datenbank, die folgenden erstellen neue Datenbanken. Nun erstellen wir eine sogenannte Rolle, die später einem Benutzer zugewiesen werden kann. Wir nennen sie movie_streaming_application. Auch das geschieht in der Systemdatenbank.

CREATE ROLE movie_streaming_application;

Generell ist es eine gute Idee, einen dezidierten Datenbankbenutzer für Anwendungen zu erstellen, da so die Rechte einer Anwendung oder eines Service auf der Datenbank eingeschränkt werden können. Wie das geht, ist nachfolgend zu sehen:

CREATE USER reactive_rental SET PASSWORD 'secret' CHANGE NOT REQUIRED; GRANT ROLE publisher TO reactive_rental; GRANT ROLE movie_streaming_application TO reactive_rental;

publisher ist eine eingebaute Rolle, die das Lesen und Schreiben beliebiger Daten, aber keine Änderungen an Indizes oder Constraints erlaubt.

Das Business hinter Videokingdom möchte nicht, dass die Benutzer von Video City sehen, wer welche Filme reviewt hat. Mit Neo4j können wir dazu den neuen feingranularen Zugriffsschutz [6] einsetzen.

simons_neo4j_1.tif_fmt1.jpgAbb. 1: Datenmodell des Movie Graph

Mit dem nachfolgenden Befehl können wir verhindern, dass die movie_streaming_application Beziehungen in der Video-City-Datenbank traversieren darf:

DENY TRAVERSE ON GRAPH `video-city` RELATIONSHIPS REVIEWED TO movie_streaming_application;

Falls wir Daten – wie in diesem Fall – nur lesen möchten, können wir schreibenden Zugriff komplett unterbinden:

DENY WRITE ON GRAPH `video-city` TO movie_streaming_application;

Der aufmerksamen Leserin wird aufgefallen sein, dass wir bis hierhin noch keinerlei Daten geladen haben. Trotzdem sind wir in der Lage, obige Restriktionen zu definieren.

Der nächste Schritt besteht aus dem Laden des Movie Graph in beide Datenbanken. Das kann entweder im Neo4j-Browser mit dem :play movies-Befehl passieren, oder wir können das Cypher-Skript benutzen, das auch im SDN/RX-Projekt zu Testzwecken zum Einsatz kommt. Es ist direkt in unserem Repository [7] zu finden. Für diesen Artikel möchten wir durchgehend im Terminal bleiben und werden daher das Skript in den Listings benutzen. Im ersten Schritt müssen wir daher die Cypher Shell mit :exit verlassen, das verlinkte Skript laden und die beiden nachfolgend gezeigten Befehle ausführen (und dabei gegebenenfalls den Pfad zum Skript anpassen):

./bin/cypher-shell -u neo4j -p secret -d videos-are-us -f movies.cypher ./bin/cypher-shell -u neo4j -p secret -d video-city -f movies.cypher

Beide Datenbanken der Videotheken sind jetzt bereit und beinhalten jeweils dieselben Daten. Im ersten Schritt überprüfen wir, ob...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang