Guida a Hazelcast con Java

1. Panoramica

Questo è un articolo introduttivo su Hazelcast in cui vedremo come creare un membro del cluster, una mappa distribuita per condividere i dati tra i nodi del cluster e creare un client Java per connettersi e interrogare i dati nel cluster.

2. Che cos'è Hazelcast?

Hazelcast è una piattaforma In-Memory Data Grid distribuita per Java. L'architettura supporta un'elevata scalabilità e distribuzione dei dati in un ambiente cluster. Supporta il rilevamento automatico dei nodi e la sincronizzazione intelligente.

Hazelcast è disponibile in diverse edizioni. Per vedere le caratteristiche di tutte le edizioni Hazelcast possiamo fare riferimento al seguente link. In questo tutorial useremo l'edizione open source.

Allo stesso modo, Hazelcast offre varie funzionalità come struttura dati distribuita, calcolo distribuito, query distribuita, ecc. Ai fini di questo articolo, ci concentreremo su una mappa distribuita .

3. Dipendenza da Maven

Hazelcast offre molte biblioteche differenti per far fronte a vari requisiti. Li possiamo trovare nel gruppo com.hazelcast a Maven Central.

Tuttavia, in questo articolo, utilizzeremo solo la dipendenza principale necessaria per creare un membro del cluster Hazelcast autonomo e il client Java Hazelcast:

 com.hazelcast hazelcast 4.0.2  

La versione attuale è disponibile nel repository centrale di Maven.

4. Una prima applicazione Hazelcast

4.1. Crea un membro Hazelcast

I membri (chiamati anche nodi) si uniscono automaticamente per formare un cluster. Questa unione automatica avviene con vari meccanismi di scoperta che i membri utilizzano per trovarsi a vicenda.

Creiamo un membro che memorizzi i dati in una mappa distribuita Hazelcast:

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

Quando avviamo l' applicazione ServerNode , possiamo vedere il testo scorrevole nella console, il che significa che creiamo un nuovo nodo Hazelcast nella nostra JVM che dovrà unirsi al cluster.

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

Per creare più nodi possiamo avviare più istanze dell'applicazione ServerNode . Di conseguenza, Hazelcast creerà e aggiungerà automaticamente un nuovo membro al cluster.

Ad esempio, se eseguiamo nuovamente l'applicazione ServerNode , vedremo il seguente registro nella console che dice che ci sono due membri nel cluster.

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. Crea una mappa distribuita

Successivamente, creiamo una mappa distribuita . Abbiamo bisogno dell'istanza di HazelcastInstance creata in precedenza per costruire una mappa distribuita che estenda l' interfaccia java.util.concurrent.ConcurrentMap .

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

Infine, aggiungiamo alcune voci alla mappa :

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

Come possiamo vedere sopra, abbiamo aggiunto 10 voci alla mappa . Abbiamo utilizzato FlakeIdGenerator per assicurarci di ottenere la chiave univoca per la mappa. Per maggiori dettagli su FlakeIdGenerator , possiamo controllare il seguente link.

Anche se questo potrebbe non essere un esempio del mondo reale, lo abbiamo usato solo per dimostrare una delle tante operazioni che possiamo applicare alla mappa distribuita. Successivamente, vedremo come recuperare le voci aggiunte dal membro del cluster dal client Java Hazelcast.

Internamente, Hazelcast partiziona le voci della mappa e distribuisce e replica le voci tra i membri del cluster. Per maggiori dettagli su Hazelcast Map , possiamo controllare il seguente link.

4.3. Crea un client Java Hazelcast

Il client Hazelcast ci consente di eseguire tutte le operazioni Hazelcast senza essere membri del cluster. Si connette a uno dei membri del cluster e gli delega tutte le operazioni a livello di cluster.

Creiamo un client nativo:

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

È semplicissimo.

4.4. Accesso alla mappa distribuita dal client Java

Next, we'll use the instance of HazelcastInstance created earlier to access the distributed Map:

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

Now we can do operations on a map without being a member of the cluster. For example, let's try to iterate over the entries:

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

5. Configuring Hazelcast

In this section, we'll focus on how to configure the Hazelcast network using declaratively (XML) and programmatically (API) and use the Hazelcast management center to monitor and manage nodes that are running.

While Hazelcast is starting up, it looks for a hazelcast.config system property. If it's set, its value is used as the path. Otherwise, Hazelcast searches for a hazelcast.xml file in the working directory or on the classpath.

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.