2012-09-06 21 views
12

Estoy desarrollando en Vert.x (basado en Netty y Hazelcast), y estoy tratando de compartir datos entre dos instancias de servidor (eche de esas instancias en diferentes máquinas, en el mismo lan).Agrupación y datos compartidos en Vert.x

Mi problema es que no sé cómo configurar los servidores vert.x para que puedan compartir sus mapas de memoria simultáneos (la teoría dice que eso es posible).

He leído muchos documentos fuera de Vert.x y Hazelcast pero aún no he tenido resultados. (No sé cómo forzar a vert.x a cargar los archivos de configuración xml de hazelcast).

¡Gracias de antemano!

Respuesta

4

Que yo sepa no se pueden compartir datos entre diferentes instancias de vert.x - a partir de la documentación

"[...] Un caso de uso es mejor resuelto proporcionando una estructura de mapa compartida que se puede accedido directamente por diferentes instancias de verticle en la misma instancia de vert.x ".

Dado que "vert.x instance" significa "instancia de jvm" no puede usar sharedmap/set entre diferentes jvm. Puede usar el bus de eventos para esto.

+2

no estoy completamente familiarizado con vert.x y no tratando de no estar de acuerdo con su estado de cuenta - esto debería ser posible utilizando Hazelcast (se replican mapas). –

+0

@castarco La documentación también dice: "En versiones posteriores de vert.x nuestro objetivo es ampliar esto para permitir que todos los ejemplares de vert.x en el clúster compartan datos". Así que mantente atento a eso. –

+0

@CarloBertuccini ¿hay alguna forma de utilizar las estructuras de datos de Hazelcast en Vert.x? –

2

Como se ha señalado, los objetos para compartir datos incluidos en Vert.x no admiten el uso compartido de datos en varias instancias de Vert.x. Para hacerlo, debe hacer lo siguiente:

  1. Use una base de datos compartida "normal".
  2. Configure un Verticle que gestione las instancias SharedMap y publique y escuche las actualizaciones desde y hacia el resto del clúster.
  3. Diseñe su aplicación para que no tenga que compartir datos de esta manera.
7

hay opciones para compartir datos entre instancias VertX en diferentes máquinas

Opción 1.

Se podría utilizar el Vert.x ClusterManager y es mapas:

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

Ese mapa está respaldado por Hazelcast IMap y se distribuye. Esto supone que está ejecutando Vertx con el parámetro -cluster y ha configurado el clúster.

Sin embargo tenga en cuenta que esto es API interna y no se recomienda generalmente para la producción. Si estás haciendo un experimento de una sola vez, entonces podría ser útil.

Opción 2.

Puede obtener acceso a Hazelcast vez VertX se inicia en el modo de clúster:

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

Fui con la opción 1 y la envolví en una clase. Si queremos actualizar Vertx en el futuro donde se rompe esto, tenemos compras en una sola parada. Para su información, el objetivo es registrarse para recibir notificaciones para monitorear nodos caídos. – fionbio

3

Vert.x 2 no es compatible con los datos compartidos en todo el clúster. Sin embargo, Vert.x 3 expone una API asíncrona que envuelve al administrador de clústeres Hazelcast subyacente.

Para Vert.x 2, sin embargo, puede usar la instancia de Hazelcast directamente en los vértices de su trabajador. Sólo tiene que utilizar los métodos estáticos de Hazelcast para obtener la instancia Vert.x Hazelcast:

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

Tenga en cuenta que sólo se debe acceder a la API Hazelcast directamente de esta manera desde dentro de un verticle trabajador. Hazelcast API está bloqueando, por lo que bloqueará el bucle de evento si se usa en un verticle normal.

3

Con Vert.x 3: si configura sus instancias Vert.x en "modo agrupado" (que puede ser tan simple como agregar -cluster a la línea de comando del iniciador Vert.x, see here for details), puede usar la interfaz SharedData para obtener acceso a "mapas distribuidos" que permite a los miembros del clúster leer y escribir datos en el clúster de forma transparente.

Ejemplo:

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