Hazelcast Embedded

Promh90·2021년 11월 15일
0

spring boot

목록 보기
1/4

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); // CN은 Cache Name
    mapConfig.setTimeToLiveSeconds(360);
    mapConfig.setMaxIdleSeconds(20);
    return mapConfig;
  }

Data Caching

  • Process 기동 후 처리 되지 않은 알림 데이터를 DB로 부터 읽어 Cache에 저장
  • 프로세스 기동중 요청받은 데이터는 Cosmos에 저장 후 refresh하는 방식으로 구현
hazelcastInstance.getMap(CachingConfig.CN).put(CachingConfig.CACHE_KEY, s); // cluster간 동일한 cache key를 사용하여 데이터 저장 및 조회
  • 실시간 알림에 대한 처리 완료시 동일하게 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);

profile
재밌고 편하게~ 나의 개발 기록 Velog

0개의 댓글