Guía de Hazelcast con Java

1. Información general

Este es un artículo introductorio sobre Hazelcast donde veremos cómo crear un miembro del clúster, un mapa distribuido para compartir datos entre los nodos del clúster y crear un cliente Java para conectar y consultar datos en el clúster.

2. ¿Qué es Hazelcast?

Hazelcast es una plataforma distribuida In-Memory Data Grid para Java. La arquitectura admite una alta escalabilidad y distribución de datos en un entorno agrupado. Admite el descubrimiento automático de nodos y la sincronización inteligente.

Hazelcast está disponible en diferentes ediciones. Para ver las características de todas las ediciones de Hazelcast, podemos consultar el siguiente enlace. En este tutorial, usaremos la edición de código abierto.

Asimismo, Hazelcast ofrece varias características como Estructura de datos distribuida, Computación distribuida, Consulta distribuida, etc. Para el propósito de este artículo, nos centraremos en un Mapa distribuido .

3. Dependencia de Maven

Hazelcast ofrece muchas bibliotecas diferentes para hacer frente a diversos requisitos. Podemos encontrarlos en el grupo com.hazelcast en Maven Central.

Sin embargo, en este artículo, solo usaremos la dependencia principal necesaria para crear un miembro del clúster Hazelcast independiente y el Cliente Hazelcast Java:

 com.hazelcast hazelcast 4.0.2  

La versión actual está disponible en el repositorio central de maven.

4. Una primera aplicación Hazelcast

4.1. Crear un miembro de Hazelcast

Los miembros (también llamados nodos) se unen automáticamente para formar un grupo. Esta unión automática se lleva a cabo con varios mecanismos de descubrimiento que los miembros utilizan para encontrarse entre sí.

Creemos un miembro que almacene datos en un mapa distribuido de Hazelcast:

public class ServerNode { HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(); ... }

Cuando iniciamos la aplicación ServerNode , podemos ver el texto fluido en la consola, lo que significa que creamos un nuevo nodo Hazelcast en nuestra JVM que tendrá que unirse al clúster.

Members [1] { Member [192.168.1.105]:5701 - 899898be-b8aa-49aa-8d28-40917ccba56c this } 

Para crear múltiples nodos, podemos iniciar las múltiples instancias de la aplicación ServerNode . Como resultado, Hazelcast creará y agregará automáticamente un nuevo miembro al grupo.

Por ejemplo, si volvemos a ejecutar la aplicación ServerNode , veremos el siguiente registro en la consola que dice que hay dos miembros en el clúster.

Members [2] { Member [192.168.1.105]:5701 - 899898be-b8aa-49aa-8d28-40917ccba56c Member [192.168.1.105]:5702 - d6b81800-2c78-4055-8a5f-7f5b65d49f30 this }

4.2. Crear un mapa distribuido

A continuación, creemos un mapa distribuido . Necesitamos la instancia de HazelcastInstance creada anteriormente para construir un mapa distribuido que amplíe la interfaz java.util.concurrent.ConcurrentMap .

Map map = hazelcastInstance.getMap("data"); ...

Finalmente, agreguemos algunas entradas al mapa :

FlakeIdGenerator idGenerator = hazelcastInstance.getFlakeIdGenerator("newid"); for (int i = 0; i < 10; i++) { map.put(idGenerator.newId(), "message" + i); }

Como podemos ver arriba, hemos agregado 10 entradas al mapa . Usamos FlakeIdGenerator para asegurarnos de obtener la clave única para el mapa. Para obtener más detalles sobre FlakeIdGenerator , podemos consultar el siguiente enlace.

Si bien este puede no ser un ejemplo del mundo real, solo lo usamos para demostrar una de las muchas operaciones que podemos aplicar al mapa distribuido. Más adelante, veremos cómo recuperar las entradas agregadas por el miembro del clúster desde el cliente de Hazelcast Java.

Internamente, Hazelcast divide las entradas del mapa y distribuye y replica las entradas entre los miembros del clúster. Para obtener más detalles sobre Hazelcast Map , podemos consultar el siguiente enlace.

4.3. Crear un cliente Java Hazelcast

El cliente de Hazelcast nos permite realizar todas las operaciones de Hazelcast sin ser miembro del clúster. Se conecta a uno de los miembros del clúster y le delega todas las operaciones de todo el clúster.

Creemos un cliente nativo:

ClientConfig config = new ClientConfig(); config.setClusterName("dev"); HazelcastInstance hazelcastInstanceClient = HazelcastClient.newHazelcastClient(config); 

Es así de simple.

4.4. Acceder al mapa distribuido desde el cliente Java

A continuación, usaremos la instancia de HazelcastInstance creada anteriormente para acceder al mapa distribuido :

Map map = hazelcastInstanceClient.getMap("data"); ...

Ahora podemos realizar operaciones en un mapa sin ser miembros del clúster. Por ejemplo, intentemos iterar sobre las entradas:

for (Entry entry : map.entrySet()) { ... }

5. Configuración de Hazelcast

En esta sección, nos enfocaremos en cómo configurar la red Hazelcast usando declarativamente (XML) y programáticamente (API) y usar el centro de administración Hazelcast para monitorear y administrar los nodos que se están ejecutando.

Mientras se inicia Hazelcast, busca una propiedad del sistema hazelcast.config . Si está configurado, su valor se usa como ruta. De lo contrario, Hazelcast busca un archivo hazelcast.xml en el directorio de trabajo o en la ruta de clase.

If none of the above works, Hazelcast loads the default configuration, i.e. hazelcast-default.xml that comes with hazelcast.jar.

5.1. Network Configuration

By default, Hazelcast uses multicast for discovering other members that can form a cluster. If multicast isn't a preferred way of discovery for our environment, then we can configure Hazelcast for a full TCP/IP cluster.

Let's configure the TCP/IP cluster using declarative configuration:


    

Alternatively, we can use the Java config approach:

Config config = new Config(); NetworkConfig network = config.getNetworkConfig(); network.setPort(5701).setPortCount(20); network.setPortAutoIncrement(true); JoinConfig join = network.getJoin(); join.getMulticastConfig().setEnabled(false); join.getTcpIpConfig() .addMember("machine1") .addMember("localhost").setEnabled(true);

By default, Hazelcast will try 100 ports to bind. In the example above, if we set the value of port as 5701 and limit the port count to 20, as members are joining the cluster, Hazelcast tries to find ports between 5701 and 5721.

If we want to choose to use only one port, we can disable the auto-increment feature by setting auto-increment to false.

5.2. Management Center Configuration

The management center allows us to monitor the overall state of the clusters, we can also analyze and browse the data structures in detail, update map configurations, and take thread dump from nodes.

To use the Hazelcast management center, we can either deploy the mancenter-version.war application into our Java application server/container or we can start Hazelcast Management Center from the command line. We can download the latest Hazelcast ZIP from hazelcast.org. The ZIP contains the mancenter-version.war file.

We can configure our Hazelcast nodes by adding the URL of the web application to hazelcast.xml and then have the Hazelcast members communicate with the management center.

So let's now configure the management center using declarative configuration:

 //localhost:8080/mancenter 

Likewise, here's the programmatic configuration:

ManagementCenterConfig manCenterCfg = new ManagementCenterConfig(); manCenterCfg.setEnabled(true).setUrl("//localhost:8080/mancenter");

6. Conclusion

In this article, we covered introductory concepts about Hazelcast. For more details, we can take a look at the Reference Manual.

As usual, all the code for this article is available over on GitHub.