hazelcast ?
- Opensource In-Memory Data Grid로 IMDG로 줄여서 불리는 제품군 중 하나
- Server/Client 모델이나 Embedded 모델의 형태로 구성 가능
- 개발 관련 Document
도입배경
- A-A 구조의 백엔드 API 프로세스에서 LB를 통해 요청 받은 데이터를 각 프로세스에 연결되어 있는 웹소켓 클라이언트에게 실시간으로 전송 해야하는 기능이 필요
- 실시간성 알림의 기능이 하루 평균 1건정도 발생, 알림 데이터의 사이즈가 크지 않음
- Azure Cosmos Paas 사용으로 주기적 Read에 대한 비용도 Cost로 책정되는 이슈
구현
설정
- hazelcast embedded cluster 설정
- Member 설정
embedded로 구성된 Member들간의 TCP/IP 프로토콜 형태로 멤버간 discovery할 IP 대역을 설정
기본적으로 포트 정보를 지정하지 않으면 5701포트부터 1씩 증가하여 멤버를 찾도록 시도함.
192.168.1.0-7
다음과 같이 IP range 할당 가능
- Cache 설정
@Bean
public HazelcastInstance hazelcastInstance() {
return Hazelcast.newHazelcastInstance(createConfig());
}
public Config createConfig() {
Config config = new Config();
config.addMapConfig(mapConfig());
NetworkConfig network = config.getNetworkConfig();
JoinConfig join = network.getJoin();
join.getMulticastConfig().setEnabled(false);
appConfig
.getHazelcastIpList()
.forEach(
ip -> {
join.getTcpIpConfig().addMember(ip);
});
join.getTcpIpConfig().setEnabled(true);
return config;
}
private MapConfig mapConfig() {
MapConfig mapConfig = new MapConfig(CN);
mapConfig.setTimeToLiveSeconds(360);
mapConfig.setMaxIdleSeconds(20);
return mapConfig;
}
Data Caching
- Process 기동 후 처리 되지 않은 알림 데이터를 DB로 부터 읽어 Cache에 저장
- 프로세스 기동중 요청받은 데이터는 Cosmos에 저장 후 refresh하는 방식으로 구현
hazelcastInstance.getMap(CachingConfig.CN).put(CachingConfig.CACHE_KEY, s);
- 실시간 알림에 대한 처리 완료시 동일하게 cache를 refresh하여 데이터 업데이트
- Websocket broadcasting의 주기를 짧게하여 캐시 데이터 전송
Map<String, String> map = hazelcastInstance.getMap(CachingConfig.CN);
String s = map.get(CachingConfig.CACHE_KEY);
ResponseDto.ReadDto dto =
gson.fromJson(s, ResponseDto.ReadDto.class);