콘텐츠로 이동

MSA

왜 쓰는지

모놀리식은 배포와 운영이 단순하지만, 규모가 커질수록 한 기능의 장애와 변경이 전체 서비스에 영향을 줄 수 있습니다. MSA는 시스템을 여러 작은 서비스로 나누어 독립적으로 개발, 배포, 확장하기 위한 방식입니다.

핵심: MSA는 기능을 작은 서비스로 나누는 것이 아니라, 데이터 소유권과 배포 책임까지 분리하는 아키텍처입니다.

어떻게 쓰는지

서비스 경계 나누기

member-service    -> 회원 데이터 소유
order-service     -> 주문 데이터 소유
payment-service   -> 결제 데이터 소유
inventory-service -> 재고 데이터 소유

서비스 경계는 테이블 수나 코드 양이 아니라 업무 책임과 데이터 소유권을 기준으로 나눕니다.

통신 방식

방식 설명 사용 예
동기 호출 요청 후 응답을 기다림 주문 화면에서 회원 정보 조회
비동기 이벤트 이벤트 발행 후 각 서비스가 처리 주문 완료 후 알림/재고 차감
order-service
  └─ OrderCreated 이벤트 발행
       ├─ payment-service
       ├─ inventory-service
       └─ notification-service

데이터 일관성

MSA에서는 서비스마다 DB를 분리하는 경우가 많습니다. 그래서 단일 DB 트랜잭션으로 여러 서비스의 데이터를 한 번에 묶기 어렵습니다.

주문 생성
  -> 결제 요청
  -> 재고 차감
  -> 실패 시 보상 처리

이런 흐름은 Saga, Outbox, 멱등성 같은 패턴을 함께 고려합니다.

언제 쓰는지

상황 MSA 적합도 이유
팀이 서비스별로 나뉨 높음 독립 개발과 배포 가능
특정 기능만 독립 확장 필요 높음 병목 서비스만 확장 가능
장애 격리가 중요함 높음 일부 서비스 장애가 전체로 번지는 것을 줄임
도메인 경계가 명확함 높음 서비스 책임을 나누기 쉬움
작은 서비스/초기 제품 낮음 운영 복잡도가 더 큼
트랜잭션이 강하게 묶임 낮음 분산 일관성 처리 비용이 큼

장점

장점 설명
독립 배포 서비스별로 배포 가능
독립 확장 트래픽이 많은 서비스만 확장
장애 격리 장애 전파 범위를 줄일 수 있음
팀 자율성 서비스별 의사결정이 쉬움
기술 선택 유연성 서비스 특성에 맞는 저장소나 런타임 선택 가능

단점

단점 설명
운영 복잡도 증가 배포, 모니터링, 로깅 대상이 늘어남
분산 트랜잭션 어려움 강한 일관성을 유지하기 어려움
네트워크 비용 프로세스 내부 호출보다 느리고 실패 가능성이 있음
테스트 복잡도 서비스 간 계약과 통합 흐름 검증 필요
데이터 중복 가능성 조회 성능을 위해 복제 데이터가 생김

특징

1. Database per Service

각 서비스가 자신의 데이터를 소유합니다. 다른 서비스가 직접 DB를 조회하지 않고 API나 이벤트로 협력합니다.

order-service -> order_db
payment-service -> payment_db

2. 서비스 간 계약

API 스펙, 이벤트 스키마, 에러 포맷이 계약이 됩니다. 계약 변경은 소비자에게 영향을 주므로 하위 호환성을 고려해야 합니다.

3. 관찰 가능성

서비스가 많아질수록 로그, 메트릭, 트레이스가 없으면 장애 원인을 찾기 어렵습니다.

4. 최종 일관성

여러 서비스가 즉시 같은 상태가 되지 않을 수 있습니다. 비즈니스가 허용하는 지연 시간과 보상 정책을 정해야 합니다.

주의할 점

작은 조직에서 성급하게 MSA를 도입하면 운영 비용이 더 큽니다.

서비스 수만큼 배포, 장애 대응, 모니터링, 테스트 복잡도가 증가합니다.

공유 DB는 서비스 분리 효과를 크게 떨어뜨립니다.

여러 서비스가 같은 테이블을 직접 읽고 쓰면 배포와 변경이 다시 강하게 묶입니다.

동기 호출 체인이 길어지면 장애가 전파됩니다.

타임아웃, 재시도, Circuit Breaker, 비동기 이벤트를 함께 설계해야 합니다.

베스트 프랙티스

권장 방식 이유
모듈러 모놀리스로 경계 검증 분산 전 도메인 경계를 확인
데이터 소유권 명확화 공유 DB로 인한 결합 방지
API/Event 계약 관리 서비스 간 변경 영향 제어
타임아웃과 재시도 정책 설정 장애 전파와 무한 대기 방지
멱등성 설계 중복 요청과 이벤트 재처리에 안전
관찰 가능성 먼저 구축 로그, 메트릭, 트레이스로 장애 분석
Outbox/Saga 고려 서비스 간 데이터 정합성 보완

실무에서는?

상황 적용 방식
주문/결제/재고 분리 각 서비스가 자신의 DB를 갖고 이벤트로 동기화
알림 서비스 분리 주문 흐름과 알림 발송을 비동기로 분리
검색 서비스 분리 원본 DB 변경 이벤트를 받아 검색 색인 갱신
대규모 트래픽 병목 서비스만 수평 확장
조직 확장 팀 단위로 서비스 소유와 배포 책임 분리

정리

항목 설명
MSA 독립 배포 가능한 작은 서비스들의 구조
핵심 기준 데이터 소유권, 배포 책임, 도메인 경계
장점 독립 배포, 확장, 장애 격리
주의 운영 복잡도, 분산 일관성, 관찰 가능성

관련 파일: - 아키텍처 패턴 — 모듈러 모놀리스와 계층 구조 - Kafka — 비동기 이벤트 통신 - 아웃박스 패턴 — 이벤트 발행 정합성