Category: hazelcast

  • Khóa học miễn phí Setting up multi-node instances nhận dự án làm có lương

    Hazelcast – Setting up multi node instances



    Given that Hazelcast is a distributed IMDG and typically is set up on multiple machines, it requires access to the internal/external network. The most important use-case being discovery of Hazelcast nodes within a cluster.

    Hazelcast requires the following ports −

    • 1 inbound port to receive pings/data from other Hazelcast nodes/clients

    • n number of outbound ports which are required to send ping/data to other members of the cluster.

    This node discovery happens in few ways −

    • Multicast

    • TCP/IP

    • Amazon EC2 auto discovery

    Of this, we will look at Multicast and TCP/IP

    Multicast

    Multicast joining mechanism is enabled by default. is a way of communication form in which message is transmitted to all the nodes in a group. And this is what Hazelcast uses to discover other members of the cluster. All the examples that we have looked at earlier use multicast to discover members.

    Example

    Let’s now explicitly turn it on. Save the following in hazelcast-multicast.xml

    <hazelcast
       xsi:schemaLocation="http://www.hazelcast.com/schema/config
       http://www.hazelcast.com/schema/config/hazelcast-config-3.12.12.xsd"
       xmlns="http://www.hazelcast.com/schema/config"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
       <network>
          <join>
             <multicast enabled="true" />
          </join>
       </network>
    </hazelcast>
    

    And then, let us execute the following −

    java -Dhazelcast.config=hazelcast-multicast.xml -cp .targetdemo-0.0.1-
    SNAPSHOT.jar com.example.demo.XMLConfigLoadExample
    

    Output

    In the output, we notice the following lines from Hazelcast which effectively means that multicast joiner is used to discover the members.

    Jan 30, 2021 5:26:15 PM com.hazelcast.instance.Node
    INFO: [localhost]:5701 [dev] [3.12.12] Creating MulticastJoiner
    

    Multicast, by default, accepts communication from all the machines in the multicast group. This may be a security concern and that is why typically, on-premise, multicast communication is firewalled. So, while multicast is good for development work, in production, it is best to use TCP/IP based discovery.

    TCP/IP

    Due to the drawbacks stated for Multicast, TCP/IP is the preferred way for communication. In case of TCP/IP, a member can connect to only known/listed members.

    Example

    Let’s use TCP/IP for discovery mechanisms. Save the following in hazelcast-tcp.xml

    <hazelcast
       xsi:schemaLocation="http://www.hazelcast.com/schema/config
       http://www.hazelcast.com/schema/config/hazelcast-config-3.12.12.xsd"
       xmlns="http://www.hazelcast.com/schema/config"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
       <network>
          <join>
             <multicast enabled="false" />
             <tcp-ip enabled="true">
                <members>localhost</members>
             </tcp-ip>
          </join>
       </network>
    </hazelcast>
    

    And then, let’s execute the following command −

    java -Dhazelcast.config=hazelcast-tcp.xml -cp .targetdemo-0.0.1-SNAPSHOT.jar
    com.example.demo.XMLConfigLoadExample
    

    Output

    The output is following −

    INFO: [localhost]:5701 [dev] [3.12.12] Creating TcpIpJoiner
    Jan 30, 2021 8:09:29 PM
    com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl
    

    The above output shows that TCP/IP joiner was use to join two members.

    And if you execute following command on two different shells −

    java ''-Dhazelcast.config=hazelcast-tcp.xml'' -cp .targetdemo-0.0.1-SNAPSHOT.jar
    com.example.demo.MultiInstanceHazelcastExample
    

    We see the following output −

    Members {size:2, ver:2} [
       Member [localhost]:5701 - 62eedeae-2701-4df0-843c-7c3655e16b0f
       Member [localhost]:5702 - 859c1b46-06e6-495a-8565-7320f7738dd1 this
    ]
    

    The above output means that the nodes were able to join using TCP/IP and both are using localhost as the IP address.

    Note that we can specify more IPs or the machine names (which would be resolved by DNS) in the XML configuration file.

    <hazelcast
       xsi:schemaLocation="http://www.hazelcast.com/schema/config
       http://www.hazelcast.com/schema/config/hazelcast-config-3.12.12.xsd"
       xmlns="http://www.hazelcast.com/schema/config"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
       <network>
          <join>
             <multicast enabled="false" />
             <tcp-ip enabled="true">
                <members>machine1, machine2....</members>
             </tcp-ip>
          </join>
       </network>
    </hazelcast>
    

    Khóa học lập trình tại Toidayhoc vừa học vừa làm dự án vừa nhận lương: Khóa học lập trình nhận lương tại trung tâm Toidayhoc

  • Khóa học miễn phí Hazelcast – Introduction nhận dự án làm có lương

    Hazelcast – Introduction



    Distributed In-memory Data Grid

    A data grid is a superset to distributed cache. Distributed cache is typically used only for storing and retrieving key-value pairs which are spread across caching servers. However, a data grid, apart from supporting storage of key-value pairs, also supports other features, for example,

    • It supports other data structures like locks, semaphores, sets, list, and queues.

    • It provides a way to query the stored data by rich querying languages, for example, SQL.

    • It provides a distributed execution engine which helps to operate on the data in parallel.

    Benefits of Hazelcast

    • Support multiple data structures − Hazelcast supports the usage of multiple data structures along with Map. Some of the examples are Lock, Semaphore, Queue, List, etc.

    • Fast R/W access − Given that all the data is in-memory, Hazelcast offers very high-speed data read/write access.

    • High availability − Hazelcast supports the distribution of data across machines along with additional support for backup. This means that the data is not stored on a single machine. So, even if a machine goes down, which occurs frequently in a distributed environment, the data is not lost.

    • High Performance − Hazelcast provides constructs which can be used to distribute the workload/computation/query among multiple worker machines. This means a computation/query uses resources from multiple machines which reduces the execution time drastically.

    • Easy to use − Hazelcast implements and extends a lot of java.util.concurrent constructs which make it very easy to use and integrate with the code. Configuration to start using Hazelcast on a machine just involves adding the Hazelcast jar to our classpath.

    Hazelcast vs Other Caches & Key-Value stores

    Comparing Hazelcast with other caches like Ehcache, Guava, and Caffeine may not be very useful. It is because, unlike other caches, Hazelcast is a distributed cache, that is, it spreads the data across machines/JVM. Although Hazelcast can work very well on single JVM as well, however, it is more useful is a distributed environment.

    Similarly comparing it with Databases like MongoDB is also of not much use. This is because, Hazelcast mostly stores data in memory (although it also supports writing to disk). So, it offers high R/W speed with the limitation that data needs to be stored in memory.

    Hazelcast also supports caching/storing complex data types and provides an interface to query them, unlike other data stores.

    A comparison, however, can be made with Redis which also offers similar features.

    Hazelcast vs Redis

    In terms of features, both Redis and Hazelcast are very similar. However, following are the points where Hazelcast scores over Redis −

    • Built for Distributed Environment from ground-up − Unlike Redis, which started as single machine cache, Hazelcast, from the very beginning, has been built for distributed environment.

    • Simple cluster scale in/out − Maintaining a cluster where nodes are added or removed is very simple in case of Hazelcast, for example, adding a node is a matter of launching the node with the required configuration. Removing a node requires simple shutting down of the node. Hazelcast automatically handles partitioning of data, etc. Having the same setup for Redis and performing the above operation requires more precaution and manual efforts.

    • Less resources needs to support failover − Redis follows master-slave approach. For failover, Redis requires additional resources to setup Redis Sentinel. These Sentinel nodes are responsible to elevate a slave to master if the original master node goes down. In Hazelcast, all nodes are treated equal, failure of a node is detected by other nodes. So, the case of a node going down is handled pretty transparently and that too without any additional set of monitoring servers.

    • Simple Distributed Compute − Hazelcast, with its EntryProcessor, provides a simple interface to send the code to the data for parallel processing. This reduces data transfer over the wire. Redis also supports this, however, achieving this requires one to be aware of Lua scripting which adds additional learning curve.


    Khóa học lập trình tại Toidayhoc vừa học vừa làm dự án vừa nhận lương: Khóa học lập trình nhận lương tại trung tâm Toidayhoc

  • Khóa học miễn phí Hazelcast – Setup nhận dự án làm có lương

    Hazelcast – Setup



    Hazelcast requires Java 1.6 or above. Hazelcast can also be used with .NET, C++, or other JVM based languages like Scala and Clojure. However, for this tutorial, we are going to use Java 8.

    Before we move on, following is the project setup that we will use for this tutorial.

    hazelcast/
    ├── com.example.demo/
    │ ├── SingleInstanceHazelcastExample.java
    │ ├── MultiInstanceHazelcastExample.java
    │ ├── Server.java
    │ └── ....
    ├── pom.xml
    ├── target/
    ├── hazelcast.xml
    ├── hazelcast-multicast.xml
    ├── ...
    

    For now, we can just create the package, i.e., com.example.demo inside the hazelcast directory. Then, just cd to that directory. We will look at other files in the upcoming sections.

    Installing Hazelcast

    Installing Hazelcast simply involves adding a JAR file to your build file. POM file or build.gradle based on whether you are using Maven or Gradle respectively.

    If you are using Gradle, adding the following to build.gradle file would be enough −

    dependencies {
       compile "com.hazelcast:hazelcast:3.12.12”
    }
    

    POM for the tutorial

    We will use the following POM for our tutorial −

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>1.0.0</modelVersion>
       <groupId>com.example</groupId>
       <artifactId>demo</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <name>demo</name>
       <description>Demo project for Hazelcast</description>
    
       <properties>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
       </properties>
    
       <dependencies>
          <dependency>
             <groupId>com.hazelcast</groupId>
             <artifactId>hazelcast</artifactId>
             <version>3.12.12</version>
          </dependency>
       </dependencies>
    
       <!-- Below build plugin is not needed for Hazelcast, it is being used only to created a shaded JAR so that -->
       <!-- using the output i.e. the JAR becomes simple for testing snippets in the tutorial-->
       <build>
          <plugins>
             <plugin>
                <!-- Create a shaded JAR and specify the entry point class-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                   <execution>
                      <phase>package</phase>
                         <goals>
                         <goal>shade</goal>
                      </goals>
                   </execution>
                </executions>
             </plugin>
          </plugins>
       </build>
    </project>
    

    Khóa học lập trình tại Toidayhoc vừa học vừa làm dự án vừa nhận lương: Khóa học lập trình nhận lương tại trung tâm Toidayhoc

  • Khóa học miễn phí Hazelcast – Home nhận dự án làm có lương

    Hazelcast Tutorial

    Hazelcast Tutorial







    Hazelcast is a distributed IMDG, i.e. in-memory data grid, which is used widely across industries by companies like Nissan, JPMorgan, Tmobile, to name a few.

    It offers various rich features including distributed cache to store key-value pairs, constructs to create and use distributed data structure, and a way to distribute your computation and queries among nodes in a cluster.

    Hazelcast is a very useful tool in developing applications that require high scalability, performance, and availability.

    Audience

    This tutorial deep dives into various features that make Hazelcast a very useful tool. It is directed towards software professionals who want to develop highly scalable and performant applications. Post this tutorial, you would have intermediate knowledge of Hazelcast and its usage.

    Prerequisites

    To make the most of this tutorial, you should have working knowledge of Data Structures, while having some exposure to Java is preferable.

    Khóa học lập trình tại Toidayhoc vừa học vừa làm dự án vừa nhận lương: Khóa học lập trình nhận lương tại trung tâm Toidayhoc

  • Khóa học miễn phí Hazelcast – First Application nhận dự án làm có lương

    Hazelcast – First Application



    Hazelcast can be run in isolation (single node) or multiple nodes can be run to form a cluster. Let us first try starting a single instance.

    Single Instance

    Example

    Now, let us try creating and using a single instance of Hazelcast cluster. For that, we will create SingleInstanceHazelcastExample.java file.

    package com.example.demo;
    
    import java.util.Map;
    import com.hazelcast.core.Hazelcast;
    import com.hazelcast.core.HazelcastInstance;
    
    public class SingleInstanceHazelcastExample {
       public static void main(String... args){
          //initialize hazelcast server/instance
          HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
          System.out.println(“Hello world”);
    
          // perform a graceful shutdown
          hazelcast.shutdown();
       }
    }
    

    Now let’s compile the code and execute it −

    mvn clean install
    java -cp target/demo-0.0.1-SNAPSHOT.jar
    com.example.demo.SingleInstanceHazelcastExample
    

    Output

    If you execute above code, the output would be −

    Hello World
    

    However, more importantly, you will also notice log lines from Hazelcast which signifies that Hazelcast has started. Since we are running this code only once, i.e., a single JVM, we would only have one member in our cluster.

    Jan 30, 2021 10:26:51 AM com.hazelcast.config.XmlConfigLocator
    INFO: Loading ''hazelcast-default.xml'' from classpath.
    Jan 30, 2021 10:26:51 AM com.hazelcast.instance.AddressPicker
    INFO: [LOCAL] [dev] [3.12.12] Prefer IPv4 stack is true.
    Jan 30, 2021 10:26:52 AM com.hazelcast.instance.AddressPicker
    INFO: [LOCAL] [dev] [3.12.12] Picked [localhost]:5701, using socket
    ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
    Jan 30, 2021 10:26:52 AM com.hazelcast.system
    ...
    
    Members {size:1, ver:1} [
       Member [localhost]:5701 - 9b764311-9f74-40e5-8a0a-85193bce227b this
    ]
    
    Jan 30, 2021 10:26:56 AM com.hazelcast.core.LifecycleService
    INFO: [localhost]:5701 [dev] [3.12.12] [localhost]:5701 is STARTED
    ...
    
    You will also notice log lines from Hazelcast at the end which signifies
    Hazelcast was shutdown:
    INFO: [localhost]:5701 [dev] [3.12.12] Hazelcast Shutdown is completed in 784 ms.
    Jan 30, 2021 10:26:57 AM com.hazelcast.core.LifecycleService
    INFO: [localhost]:5701 [dev] [3.12.12] [localhost]:5701 is SHUTDOWN
    

    Cluster: Multi Instance

    Now, let”s create MultiInstanceHazelcastExample.java file (as below) which would be used for multi-instance cluster.

    package com.example.demo;
    
    import com.hazelcast.core.Hazelcast;
    import com.hazelcast.core.HazelcastInstance;
    
    public class MultiInstanceHazelcastExample {
       public static void main(String... args) throws InterruptedException{
          //initialize hazelcast server/instance
          HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
    
          //print the socket address of this member and also the size of the cluster
          System.out.println(String.format("[%s]: No. of hazelcast members: %s",
             hazelcast.getCluster().getLocalMember().getSocketAddress(),
             hazelcast.getCluster().getMembers().size()));
    
          // wait for the member to join
          Thread.sleep(30000);
    
          //perform a graceful shutdown
          hazelcast.shutdown();
       }
    }
    

    Let’s execute the following command on two different shells

    java -cp .targetdemo-0.0.1-SNAPSHOT.jar
    com.example.demo.MultiInstanceHazelcastExample
    

    You would notice on the 1st shell that a Hazelcast instance has been started and a member has been assigned. Note the last line of output which says that there is a single member using port 5701.

    Jan 30, 2021 12:20:21 PM com.hazelcast.internal.cluster.ClusterService
    INFO: [localhost]:5701 [dev] [3.12.12]
    Members {size:1, ver:1} [
       Member [localhost]:5701 - b0d5607b-47ab-47a2-b0eb-6c17c031fc2f this
    ]
    Jan 30, 2021 12:20:21 PM com.hazelcast.core.LifecycleService
    INFO: [localhost]:5701 [dev] [3.12.12] [localhost]:5701 is STARTED
    [/localhost:5701]: No. of hazelcast members: 1
    

    You would notice on the 2nd shell that a Hazelcast instance has joined the 1st instance. Note the last line of the output which says that there are now two members using port 5702.

    INFO: [localhost]:5702 [dev] [3.12.12]
    Members {size:2, ver:2} [
       Member [localhost]:5701 - b0d5607b-47ab-47a2-b0eb-6c17c031fc2f
       Member [localhost]:5702 - 037b5fd9-1a1e-46f2-ae59-14c7b9724ec6 this
    ]
    Jan 30, 2021 12:20:46 PM com.hazelcast.core.LifecycleService
    INFO: [localhost]:5702 [dev] [3.12.12] [localhost]:5702 is STARTED
    [/localhost:5702]: No. of hazelcast members: 2
    

    Khóa học lập trình tại Toidayhoc vừa học vừa làm dự án vừa nhận lương: Khóa học lập trình nhận lương tại trung tâm Toidayhoc

  • Khóa học miễn phí Hazelcast – Serialization nhận dự án làm có lương

    Hazelcast – Serialization



    Hazelcast is ideally used in an environment where data/query are distributed across machines. This requires data to be serialized from our Java objects to a byte array which can be transferred over the network.

    Hazelcast supports various types of Serialization. However, let’s look at some commonly used ones, i.e., Java Serialization and Java Externalizable.

    Java Serialization

    Example

    First let”s look at Java Serialization. Let”s say, we define an Employee class with Serializable interface implemented.

    public class Employee implements Serializable{
       private static final long serialVersionUID = 1L;
       private String name;
       private String department;
       public Employee(String name, String department) {
          super();
          this.name = name;
          this.department = department;
       }
       public String getName() {
          return name;
       }
       public void setName(String name) {
          this.name = name;
       }
       public String getDepartment() {
          return department;
       }
       public void setDepartment(String department) {
          this.department = department;
       }
       @Override
       public String toString() {
          return "Employee [name=" + name + ", department=" + department + "]";
       }
    }
    

    Let’s now write code to add Employee object to the Hazelcast map.

    public class EmployeeExample {
       public static void main(String... args){
          //initialize hazelcast server/instance
          HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
          //create a set to track employees
          Map<Employee, String> employeeOwners=hazelcast.getMap("employeeVehicleMap");
          Employee emp1 = new Employee("John Smith", "Computer Science");
          // add employee to set
          System.out.println("Serializing key-value and add to map");
          employeeOwners.put(emp1, "Honda");
          // check if emp1 is present in the set
          System.out.println("Serializing key for searching and Deserializing
          value got out of map");
          System.out.println(employeeOwners.get(emp1));
          // perform a graceful shutdown
          hazelcast.shutdown();
       }
    }
    

    Output

    It will produce the following output −

    Serializing key-value and add to map
    Serializing key for searching and Deserializing value got out of map
    Honda
    

    A very important aspect here is that simply by implementing a Serializable interface, we can make Hazelcast use Java Serialization. Also note that Hazelcast stores serialized data for key and value instead of storing it in-memory like HashMap. So, Hazelcast does the heavy-lifting of Serialization and Deserialization.

    Example

    However, there is a pitfall here. In the above case, what if the department of the employee changes? The person is still the same.

    public class EmployeeExampleFailing {
       public static void main(String... args){
          //initialize hazelcast server/instance
          HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
          //create a set to track employees
          Map<Employee, String> employeeOwners=hazelcast.getMap("employeeVehicleMap");
          Employee emp1 = new Employee("John Smith", "Computer Science");
          // add employee to map
          System.out.println("Serializing key-value and add to map");
          employeeOwners.put(emp1, "Honda");
          Employee empDeptChange = new Employee("John Smith", "Electronics");
          // check if emp1 is present in the set
          System.out.println("Checking if employee with John Smith is present");
          System.out.println(employeeOwners.containsKey(empDeptChange));
          Employee empSameDept = new Employee("John Smith", "Computer Science");
          System.out.println("Checking if employee with John Smith is present");
          System.out.println(employeeOwners.containsKey(empSameDept));
          // perform a graceful shutdown
          hazelcast.shutdown();
       }
    }
    

    Output

    It will produce the following output −

    Serializing key-value and add to map
    Checking if employee with name John Smith is present
    false
    Checking if employee with name John Smith is present
    true
    

    It is because Hazelcast does not deserialize the key, i.e., Employee while comparison. It directly compares the bytecode of the serialized key. So, an object with the same value to all the attributes would be treated the same. But if the value to those attributes changes, for example, department in the above scenario, those two keys are treated as unique.

    Java Externalizable

    What if, in the above example, we don”t care about the value of the department while performing serialization/deserialization of keys. Hazelcast also supports Java Externalizable which gives us control over what tags are used for serialization and deserialization.

    Example

    Let’s modify our Employee class accordingly −

    public class EmplyoeeExternalizable implements Externalizable {
       private static final long serialVersionUID = 1L;
       private String name;
       private String department;
       public EmplyoeeExternalizable(String name, String department) {
          super();
          this.name = name;
          this.department = department;
       }
       @Override
       public void readExternal(ObjectInput in) throws IOException,
       ClassNotFoundException {
          System.out.println("Deserializaing....");
          this.name = in.readUTF();
       }
       @Override
       public void writeExternal(ObjectOutput out) throws IOException {
          System.out.println("Serializing....");
          out.writeUTF(name);
       }
       public String getName() {
          return name;
       }
       public void setName(String name) {
          this.name = name;
       }
       public String getDepartment() {
          return department;
       }
       public void setDepartment(String department) {
          this.department = department;
       }
       @Override
       public String toString() {
          return "Employee [name=" + name + ", department=" + department + "]";
       }
    }
    

    So, as you can see from the code, we have added readExternal/writeExternal methods which are responsible for serialization/deserialization. Given that we are not interested in the department while serialization/deserialization, we exclude those in readExternal/writeExternal methods.

    Example

    Now, if we execute the following code −

    public class EmployeeExamplePassing {
       public static void main(String... args){
          //initialize hazelcast server/instance
          HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
          //create a set to track employees
          Map<EmplyoeeExternalizable, String> employeeOwners=hazelcast.getMap("employeeVehicleMap");
          EmplyoeeExternalizable emp1 = new EmplyoeeExternalizable("John Smith", "Computer Science");
          // add employee to map
          employeeOwners.put(emp1, "Honda");
          EmplyoeeExternalizable empDeptChange = new EmplyoeeExternalizable("John Smith", "Electronics");
          // check if emp1 is present in the set
          System.out.println("Checking if employee with John Smith is present");
          System.out.println(employeeOwners.containsKey(empDeptChange));
          EmplyoeeExternalizable empSameDept = new EmplyoeeExternalizable("John Smith", "Computer Science");
          System.out.println("Checking if employee with John Smith is present");
          System.out.println(employeeOwners.containsKey(empSameDept));
          // perform a graceful shutdown
          hazelcast.shutdown();
       }
    }
    

    Output

    The output we get is −

    Serializing....
    Checking if employee with John Smith is present
    Serializing....
    true
    Checking if employee with John Smith is present
    Serializing....
    true
    

    As the output shows, using Externalizable interface, we can provide Hazelcast with serialized data for only the name of the employee.

    Also note that Hazelcast serializes our key twice −

    • Once while storing the key,

    • And, second for searching the given key in the map. As stated earlier, this is because Hazelcast uses serialized byte arrays for key comparison.

    Overall, using Externalizable has more benefits as compared to Serializable if we want to have more control over what attributes are to be serialized and how we want to handle them.


    Khóa học lập trình tại Toidayhoc vừa học vừa làm dự án vừa nhận lương: Khóa học lập trình nhận lương tại trung tâm Toidayhoc

  • Khóa học miễn phí Hazelcast – Data Structures nhận dự án làm có lương

    Hazelcast – Data Structures



    java.util.concurrent package provides data structures such as AtomicLong, CountDownLatch, ConcurrentHashMap, etc. which are useful when you have more than one thread reading/writing data to the data structure. But to provide thread safety, all of these threads are expected to be on a single JVM/machine.

    There are two major benefits of distributing data structure −

    • Better Performance − If more than one machine has access to the data, all of them can work in parallel and complete the work in a lesser timespan.

    • Data Backup − If a JVM/machine goes down, we have another JVMs/machines holding the data

    Hazelcast provides a way to distribute your data structure across JVMs/machines.


    Khóa học lập trình tại Toidayhoc vừa học vừa làm dự án vừa nhận lương: Khóa học lập trình nhận lương tại trung tâm Toidayhoc