2012-09-06 16 views
12

Ich entwickle in Vert.x (basierend auf Netty und Hazelcast), und ich versuche, Daten zwischen zwei Serverinstanzen (eache dieser Instanzen in verschiedenen Maschinen, auf der dasselbe lan).Clustering und Shared Data in Vert.x

Mein Problem ist, dass ich nicht weiß, wie die vert.x Server zu konfigurieren, damit sie ihre gleichzeitige Speicherkarten freigeben können (die Theorie sagt, dass das möglich ist).

Ich habe viele Dokumente von Vert.x und Hazelcast gelesen, aber ich hatte noch keine Ergebnisse. (Ich weiß nicht, wie man vert.x zwingt, hazelcast xml-Konfigurationsdateien zu laden).

Vielen Dank im Voraus!

Antwort

4

Afaik Sie können keine Daten zwischen verschiedenen Instanzen von Vert.x teilen - von der Dokumentation

„[...] Ein solcher Anwendungsfall ist gelöst durch Schaffung einer gemeinsamen Map-Struktur, vorausgesetzt sein kann Sie werden direkt von verschiedenen verticle-Instanzen in derselben vert.x-Instanz aufgerufen. "

Da "vert.x instance" für "jvm instance" steht, können Sie sharedmap/set nicht zwischen verschiedenen jvm verwenden. Sie können dafür den Event-Bus verwenden.

+2

ich mit Vert.x nicht vollständig vertraut bin und nicht versuchen, mit Ihrer Aussage widersprechen - dies sollte möglich sein, unter Verwendung von Hazelcast (Karten repliziert werden). –

+0

@castarco Die Dokumentation sagt auch: "In späteren Versionen von vert.x möchten wir dies erweitern, damit Daten von allen vert.x-Instanzen im Cluster gemeinsam genutzt werden können." Behalte das im Auge. –

+0

@CarloBertuccini Gibt es eine Möglichkeit, Hazelcast-Datenstrukturen in Vert.x zu verwenden? –

2

Wie bereits erwähnt wurde, unterstützen die in Vert.x gebündelten Datenübertragungsobjekte keine gemeinsame Nutzung von Daten über mehrere Vert.x-Instanzen hinweg. Um dies zu tun, müssten Sie entweder:

  1. Verwenden Sie eine "normale" freigegebene Datenbank.
  2. Richten Sie ein Verticle ein, das die SharedMap Instanzen verwaltet und Aktualisierungen für den Rest des Clusters veröffentlicht und wartet.
  3. Gestalten Sie Ihre Anwendung so, dass Sie auf diese Weise keine Daten freigeben müssen.
7

Es gibt Optionen für den Austausch von Daten unter VertX Instanzen auf verschiedenen Maschinen

Option 1.

Sie konnten die Vert.x ClusterManager verwenden und es Karten:

ClusterManager clusterManager = ((VertxInternal)vertx).clusterManager(); 
Map map = clusterManager.getSyncMap("mapName"); // shared distributed map 

Diese Map wird von einer Hazelcast IMap unterstützt und verteilt. Dies setzt voraus, dass Sie vertx mit dem Parameter -cluster ausführen und Clustering konfiguriert haben.

Beachten Sie jedoch, dass dies interne API ist und nicht allgemein für die Produktion empfohlen wird. Wenn Sie ein einmaliges Experiment machen, könnte es nützlich sein.

Option 2.

Sie können einmal Zugang erhalten Hazelcast VertX in geclusterten Modus gestartet wird:

Set<HazelcastInstance> instances = Hazelcast.getAllHazelcastInstances(); 
    HazelcastInstance hz = instances.stream().findFirst().get(); 
    Map map = hz.getMap("mapName"); // shared distributed map 
+0

Ging mit Option 1 und wickelte es in eine Klasse. Wenn wir in der Zukunft vertx aktualisieren wollen, wo das funktioniert, haben wir alles aus einer Hand. Zu guter Letzt ist es das Ziel, sich für Benachrichtigungen zu registrieren, um die ausgefallenen Knoten zu überwachen. – fionbio

3

Vert.x 2 nicht clusterweite gemeinsam genutzten Daten unterstützen. Vert.x 3 stellt jedoch eine asynchrone API bereit, die den zugrunde liegenden Hazelcast-Cluster-Manager umschließt.

Für Vert.x 2, Sie können die Hazelcast-Instanz jedoch direkt in Ihren Worker-Verticles verwenden. verwenden Hazelcast statische Methoden nur die Vert.x Hazelcast Instanz zu erhalten:

HazelcastInstance hazelcast = Hazelcast.getAllHazelcastInstances().iterator().next(); 

Beachten Sie, dass Sie nur die API Hazelcast direkt aus einem Arbeiter verticle auf diese Weise zugreifen soll. Das Hazelcast-API blockiert, sodass es die Ereignisschleife blockiert, wenn es in einem normalen verticle verwendet wird.

3

Mit Vert.x 3 - wenn Sie Ihre Vert.x Instanzen in „Cluster-Modus“ konfiguriert werden (die so einfach sein kann -cluster an die Befehlszeile des Vert.x Launcher wie das Hinzufügen, see here for details), dann können Sie verwenden die SharedData Schnittstelle, um Zugriff auf "verteilte Karten" zu erhalten, die es Clustermitgliedern ermöglicht, Daten transparent über den Cluster zu lesen und zu schreiben.

Beispiel:

if (vertx.isClustered()) { 
    log.info("Using clustered data store"); 
    vertx.sharedData().<String, MyEntity>getClusterWideMap("entities", 
      res -> { 
       AsyncMap<String, MyEntity> dataMap = res.result(); 
       setDataStore(dataMap); 
      }); 
}