/
내부 클러스터링과 Feature별 MSA를 고려한 설계

내부 클러스터링과 Feature별 MSA를 고려한 설계

  1. 내부 클러스터링: Hazelcast Pub/Sub 이벤트 드리븐 구조 활용

    • 역할:

      • 클러스터 내부의 노드 간 통신 및 데이터 동기화.

      • 동일 클러스터 내에서 이벤트를 빠르고 효율적으로 전달.

    • 이점:

      • 빠른 내부 통신: 클러스터 내부 노드 간 네트워크 지연 최소화.

      • 비동기 처리: 이벤트를 구독하는 서비스가 필요할 때 비동기로 처리 가능.

      • 단순화된 상태 관리: Hazelcast의 분산 데이터 구조(Map, Queue 등)와 연계하여 상태 동기화.

  2. Feature별 MSA: 헥사고날 아키텍처 적용

    • 역할:

      • 각 Feature를 독립적으로 설계하여 변경에 유연.

      • 내부 의존성을 최소화하고, 도메인 로직 중심으로 아키텍처 설계.

    • 구조:

      • Domain (핵심 비즈니스 로직): Feature의 핵심 규칙과 데이터 모델.

      • Application (서비스): 도메인 로직을 조작하는 애플리케이션 계층.

      • Ports & Adapters:

        • Port: 도메인과 외부 간의 인터페이스.

        • Adapter: Port를 구현하여 실제 기능을 수행하는 외부 시스템(API, DB 등).

  3. 외부 통신: REST API 기반

    • 역할:

      • Feature 서비스 간 통신 및 클러스터 외부의 다른 시스템과의 통신.

    • 이점:

      • 동기적 요청/응답: 데이터를 요청하고 즉시 결과를 받는 방식.

      • 표준화된 통신 방식: REST API는 대부분의 언어와 환경에서 지원.

      • 강한 일관성 보장: 한 서비스의 결과를 다른 서비스에서 즉시 사용 가능.


구조의 상세한 흐름

1. 클러스터 내부 통신: Hazelcast Pub/Sub

  • 예시:

    • OrderService가 주문 생성 이벤트를 Hazelcast Pub/Sub으로 발행.

    • 클러스터 내 다른 서비스(InventoryService, PaymentService)가 해당 이벤트를 구독하여 처리.

// 이벤트 발행 ITopic<String> topic = hazelcastInstance.getReliableTopic("orderCreated"); topic.publish("Order #123 created");

 

// 이벤트 구독 topic.addMessageListener(message -> { System.out.println("Processing order: " + message.getMessageObject()); });

 

2. Feature별 MSA: 헥사고날 아키텍처

  • 각 Feature는 헥사고날 아키텍처를 통해 설계.

  • 의존성 분리:

    • 내부 클러스터 통신(Hazelcast)과 외부 통신(API)를 Port-Adapter로 분리.

  • 예시 구조:

    InventoryService ├── Domain │ └── Inventory (핵심 비즈니스 로직) ├── Application │ └── InventoryService (도메인 조작) ├── Ports │ ├── InventoryEventPort (클러스터 이벤트 처리) │ └── InventoryAPIPort (외부 API 통신) └── Adapters ├── HazelcastAdapter (클러스터 이벤트 통신 구현) └── RestAdapter (API 통신 구현)

     

3. 외부 통신: REST API

  • Feature 간 동기적 데이터 요청 시 REST API 사용.

  • 예: PaymentService가 주문 데이터를 확인하기 위해 OrderService의 API 호출.

 


제안된 구조의 장점

1. 효율적인 내부 통신

  • Hazelcast Pub/Sub은 클러스터 내 노드 간 빠르고 효율적인 통신을 지원.

  • 실시간 이벤트 전파와 비동기 처리로 성능 향상.

2. 독립적인 Feature 설계

  • 헥사고날 아키텍처를 적용하여 각 Feature가 독립적으로 동작.

  • 변경이 필요한 경우에도 다른 Feature에 영향을 최소화.

3. 서비스 간 표준화된 통신

  • REST API를 통해 외부 서비스나 클러스터 외부 시스템과 쉽게 통신 가능.

  • 표준 HTTP 프로토콜 사용으로 호환성 높음.

4. 느슨한 결합과 강한 일관성의 조화

  • 클러스터 내부 통신은 이벤트 기반(Hazelcast), 서비스 간 통신은 동기 기반(API)으로 설계.

  • 두 방식의 장점을 적절히 활용하여 설계의 유연성과 안정성 확보.


구현 시 고려사항

1. Pub/Sub 관리

  • 문제: 이벤트가 과도하게 많아질 경우 처리 성능에 영향을 줄 수 있음.

  • 대안:

    • Reliable Topic을 사용하여 메시지 처리 보장.

    • 이벤트 소비 속도를 모니터링하고 병렬 처리(멀티 스레드) 추가.

2. REST API 장애 관리

  • 문제: API 통신 대상 서비스가 다운되면 호출 서비스도 영향을 받을 수 있음.

  • 대안:

    • Circuit Breaker 패턴(Hystrix, Resilience4j) 사용.

    • 호출 실패 시 재시도(Retry) 및 백오프(Backoff) 정책 적용.

3. 의존성 관리

  • 문제: 클러스터 통신(Hazelcast)와 API 통신의 구현이 복잡해질 수 있음.

  • 대안:

    • Ports & Adapters 패턴으로 Hazelcast와 REST API 통신을 분리.

    • 클러스터 통신과 API 통신을 별도 모듈로 관리.


결론

  • 내부 클러스터 통신: Hazelcast Pub/Sub을 활용한 비동기 이벤트 기반 통신.

  • Feature 설계: 헥사고날 아키텍처를 적용해 독립적인 MSA 구현.

  • 외부 통신: REST API를 통한 동기식 요청/응답 처리.