내부 클러스터링과 Feature별 MSA를 고려한 설계
내부 클러스터링: Hazelcast Pub/Sub 이벤트 드리븐 구조 활용
역할:
클러스터 내부의 노드 간 통신 및 데이터 동기화.
동일 클러스터 내에서 이벤트를 빠르고 효율적으로 전달.
이점:
빠른 내부 통신: 클러스터 내부 노드 간 네트워크 지연 최소화.
비동기 처리: 이벤트를 구독하는 서비스가 필요할 때 비동기로 처리 가능.
단순화된 상태 관리: Hazelcast의 분산 데이터 구조(Map, Queue 등)와 연계하여 상태 동기화.
Feature별 MSA: 헥사고날 아키텍처 적용
역할:
각 Feature를 독립적으로 설계하여 변경에 유연.
내부 의존성을 최소화하고, 도메인 로직 중심으로 아키텍처 설계.
구조:
Domain (핵심 비즈니스 로직): Feature의 핵심 규칙과 데이터 모델.
Application (서비스): 도메인 로직을 조작하는 애플리케이션 계층.
Ports & Adapters:
Port: 도메인과 외부 간의 인터페이스.
Adapter: Port를 구현하여 실제 기능을 수행하는 외부 시스템(API, DB 등).
외부 통신: 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를 통한 동기식 요청/응답 처리.