2016-12-29 8 views
0

Ich bin neu bei Vert.x und möchte einen Pool von Worker-Verticles implementieren, um Datenbankabfragen mit BoneCP durchzuführen. Ich bin jedoch etwas verwirrt darüber, wie man sie zum Arbeiten anruft und wie man den BoneCP-Verbindungspool zwischen ihnen teilt.Vertex-Worker-Verticle-Pool für JDBC

habe ich in Vertx DeploymentManager source dass das Verfahren, bis start(Future) nicht entfalteten synchron und dann wird die verticle gehalten im Speicher aufgerufen wird. Nachdem die Methode start abgeschlossen wurde, wie lautet der richtige Aufruf von Methoden auf der Arbeitsvertikale? Wenn ich viele Instanzen des verticle deploye (unter Verwendung von DeploymentOptions.setInstances()), wird Vertx Lastenausgleich zwischen ihnen?

Ich habe gesehen, dass Vert.x kommt mit einem JDBC-Client und einem Worker-Pool, aber es hat begrenzte Datentypen, mit denen ich arbeiten kann, weil es den EventBus verwendet und serialisiert alle Daten von der Datenbank zurückgegeben. Ich muss mit vielen verschiedenen Datentypen arbeiten (einschließlich Datumsangaben, BigDecimals und binären Objekten) und möchte die Serialisierung so weit wie möglich vermeiden, aber stattdessen Abfragen im Worker verticle durchführen, die Ergebnisse verarbeiten und ein Objekt über ein Future oder AsyncResult zurückgeben (Ich glaube, das ist auf dem Haufen, also keine Serialisierung benötigt, ist das korrekt?).

Bitte helfen Sie mir, alle diese Fragen zu lösen :) Ich werde viel zu schätzen wissen, wenn Sie mir Beispiele geben, wie kann ich das machen Arbeit!

Danke!

Antwort

0

In Ihrer start(...)-Methode registrieren Sie Ereignis-Listener mit Ereignis-Bus, da Sie so mit verticles interagieren (worker oder nicht). Ja, wenn Sie viele Instanzen bereitstellen, verwendet Vert.x Round-Robin, um Nachrichten an diese Instanzen zu senden.

Für das, was Sie beschreiben, ist Vert.x möglicherweise nicht die beste Lösung, da es am besten mit asynchroner E/A funktioniert. Sie könnten besser mit standardmäßigen Java-Tools für den gemeinsamen Zugriff arbeiten, um die Auslastung zu verwalten, d. H. Executor und Freunde.

+0

Vielen Dank für Ihre Hilfe. Ich werde meine Verticles mit Listenern auf dem Event-Bus einrichten, um Anfragen zu bearbeiten, aber ich muss immer noch daran arbeiten, den jdbc-Verbindungspool zwischen ihnen zu teilen. Ich wollte dies in Vert.x implementieren, um das Framework zu lernen und asynchrone I/O zu nutzen, um viele Anfragen mit weniger Ressourcen zu bearbeiten :) – rober710

0

Ich werde versuchen, Ihre Fragen eins nach dem anderen zu beantworten.

, wie man "nennen sie

arbeiten

Sie Ihre Arbeiter rufen verticles die EventBus verwenden. Das ist der richtige Weg, um zwischen ihnen zu kommunizieren. Bitte beachten Sie folgendes Beispiel:
https://github.com/vert-x3/vertx-examples/blob/master/core-examples/src/main/java/io/vertx/example/core/verticle/worker/MainVerticle.java#L27

wie der BoneCP Verbindungspool zwischen ihnen teilen.

Nicht. Erstellen Sie stattdessen für jeden einen kleinen Verbindungspool. Andernfalls wird ein unerwartetes Verhalten verursacht.

config.setMinConnectionsPerPartition(1); 
config.setMaxConnectionsPerPartition(5); 
config.setPartitionCount(1); 

wird Vertx tun Last Ausgleich zwischen ihnen

Nein, das ist der Grund @Jochen Bedersdorfer ist und ich schlage vor, EventBus zu verwenden. Sie können einen Verweis auf Ihre Worker verticle haben, wie Sie es vorgeschlagen haben, aber dann stecken Sie in der 1: 1-Konfiguration fest.

Rückkehr ein Objekt über eine Zukunft oder AsyncResult (ich glaube, das auf Haufen gemacht wird, so dass keine Serialisierung erforderlich,? Ist das richtig)

Das ist richtig. Aber wieder steckst du mit dem 1: 1-Mapping fest. Was ist viel schlechter in Bezug auf die Leistung, die Serialisierung (das ist mit Puffern).

Wenn Sie noch so etwas tun müssen, sollten Sie vielleicht nicht Arbeiter verticles überhaupt verwenden, aber so etwas wie .executeBlocking:
https://github.com/vert-x3/vertx-examples/blob/master/core-examples/src/main/java/io/vertx/example/core/execblocking/ExecBlockingExample.java#L25