티스토리 뷰
HazelcastInstance 소개
HazelcastInstance는 Hazelcast 클러스터의 중심이 되는 인터페이스로, 분산 데이터 구조와 컴퓨팅 기능을 제공하는 역할을 합니다. 이를 통해 분산 맵(Map), 큐(Queue), 주제(Topic) 등 다양한 데이터 구조에 접근할 수 있으며, 분산 실행(Executor Service)과 같은 기능도 사용할 수 있습니다.
1. HazelcastInstance란?
Hazelcast는 인메모리 데이터 그리드(IMDG, In-Memory Data Grid) 로, 데이터를 메모리에 저장하여 빠른 속도로 접근할 수 있도록 합니다. HazelcastInstance는 이러한 Hazelcast 클러스터를 구성하는 개별 노드를 의미하며, 분산 데이터 저장과 처리를 담당합니다.
주요 특징
- 자동 클러스터링: 같은 네트워크에서 실행된 Hazelcast 인스턴스들은 자동으로 클러스터를 형성합니다.
- 분산 데이터 저장: 데이터를 여러 노드에 분산 저장하여 성능과 안정성을 높입니다.
- 확장성: 노드를 추가하면 성능이 수평 확장됩니다.
- 고가용성: 특정 노드가 장애가 발생하더라도 다른 노드가 데이터를 유지합니다.
- 다양한 데이터 구조 제공: 분산 맵(IMap), 큐(IQueue), 주제(ITopic) 등 다양한 데이터 구조를 지원합니다.
2. HazelcastInstance 생성 방법
1) 단일 노드 실행 (Standalone Mode)
아래 코드를 실행하면 단일 노드로 Hazelcast 인스턴스를 생성할 수 있습니다.
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
public class HazelcastExample {
public static void main(String[] args) {
HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
System.out.println("Hazelcast 인스턴스가 시작되었습니다.");
}
}
설명: Hazelcast가 기본 설정으로 실행되며, 다른 노드와 연결되지 않은 단일 노드 환경입니다.
2) 클러스터 모드 실행 (Cluster Mode)
같은 네트워크에서 두 개 이상의 HazelcastInstance를 실행하면 자동으로 클러스터가 형성됩니다.
HazelcastInstance node1 = Hazelcast.newHazelcastInstance();
HazelcastInstance node2 = Hazelcast.newHazelcastInstance();
System.out.println("클러스터 멤버 수: " + node1.getCluster().getMembers().size());
설명: 별도 설정 없이도 같은 네트워크에서 실행하면 자동으로 클러스터가 구성됩니다.
3) 클라이언트-서버 모드 실행 (Client-Server Mode)
Hazelcast는 서버 노드(HazelcastInstance)와 클라이언트(HazelcastClientInstance)를 분리하여 사용할 수도 있습니다.
서버 코드
import com.hazelcast.config.Config;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
public class HazelcastServer {
public static void main(String[] args) {
Config config = new Config();
config.setClusterName("my-cluster");
HazelcastInstance server = Hazelcast.newHazelcastInstance(config);
System.out.println("Hazelcast 서버가 시작되었습니다.");
}
}
클라이언트 코드
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.core.HazelcastInstance;
public class HazelcastClientApp {
public static void main(String[] args) {
ClientConfig clientConfig = new ClientConfig();
clientConfig.setClusterName("my-cluster");
HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);
System.out.println("Hazelcast 클라이언트가 서버에 연결되었습니다.");
}
}
설명: 클라이언트는 데이터를 저장하지 않으며, 서버 노드에 접근하여 데이터를 조회하거나 수정하는 역할을 합니다.
3. HazelcastInstance의 주요 데이터 구조
1) 분산 맵 (IMap)
Hazelcast의 IMap은 일반적인 HashMap과 유사하지만, 여러 노드에 데이터를 분산 저장할 수 있습니다.
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.map.IMap;
public class HazelcastMapExample {
public static void main(String[] args) {
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<String, String> map = instance.getMap("myMap");
map.put("key1", "value1");
System.out.println("key1의 값: " + map.get("key1"));
}
}
설명: 분산 환경에서도 데이터를 공유할 수 있으며, 노드 간 동기화가 자동으로 이루어집니다.
2) 분산 큐 (IQueue)
FIFO(First In, First Out) 방식으로 동작하는 분산 메시지 큐입니다.
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.collection.IQueue;
public class HazelcastQueueExample {
public static void main(String[] args) throws Exception {
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IQueue<String> queue = instance.getQueue("myQueue");
queue.put("message1");
System.out.println("큐에서 꺼낸 값: " + queue.take());
}
}
설명: 분산 메시징 시스템을 구현할 때 사용할 수 있습니다.
3) 분산 주제 (ITopic)
Pub/Sub(발행-구독) 모델을 지원하는 데이터 구조입니다.
import com.hazelcast.core.*;
public class HazelcastTopicExample {
public static void main(String[] args) {
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
ITopic<String> topic = instance.getTopic("myTopic");
topic.addMessageListener(message ->
System.out.println("받은 메시지: " + message.getMessageObject())
);
topic.publish("안녕하세요, Hazelcast입니다!");
}
}
설명: 여러 노드 간 메시지를 실시간으로 브로드캐스트할 수 있습니다.
4. HazelcastInstance 종료 및 관리
1) HazelcastInstance 종료
사용이 끝난 HazelcastInstance는 명시적으로 종료하는 것이 좋습니다.
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
instance.shutdown();
2) 모든 인스턴스 종료
Hazelcast.shutdownAll();
설명: Hazelcast 클러스터의 모든 노드를 종료합니다.
5. 결론
- HazelcastInstance는 Hazelcast 클러스터를 구성하는 핵심 요소로, 데이터 저장 및 처리를 담당합니다.
- 자동 클러스터링 기능을 제공하며, 고가용성 및 확장성이 뛰어납니다.
- IMap, IQueue, ITopic 등 다양한 분산 데이터 구조를 활용할 수 있습니다.
- 클라이언트-서버 모드와 임베디드 모드를 지원하여 다양한 환경에 적용할 수 있습니다.