backend-interview-guide

마이크로서비스 아키텍처 (Microservices Architecture, MSA)

목차


마이크로서비스 아키텍처란?

마이크로서비스 아키텍처(MSA) 는 애플리케이션을 작고 독립적인 서비스 단위로 분리하여 개발, 배포, 운영할 수 있도록 설계하는 분산 소프트웨어 아키텍처입니다. 각 서비스는 특정 도메인 기능(예: 사용자 관리, 주문 처리)을 담당하며, 다른 서비스와 독립적으로 개발되고 배포됩니다.

주요 개념:

  1. 작고 자율적인 서비스: 각 서비스는 특정 기능에 집중하며, 작은 단위로 설계됩니다.
  2. 독립적 배포: 서비스 간 의존성을 최소화하여 개별 서비스가 독립적으로 업데이트 및 배포될 수 있습니다.
  3. 분산 아키텍처: 서비스 간 통신은 주로 HTTP/REST API, gRPC, 메시징 시스템(Kafka, RabbitMQ) 등을 통해 이루어집니다.
  4. 폴리글랏 프로그래밍: 각 서비스는 요구사항에 따라 다른 언어, 프레임워크, 데이터베이스를 선택하여 구현할 수 있습니다.

MSA의 특징

1. 도메인 중심 설계

2. 독립적 데이터베이스

3. 자율적 팀 구성

4. API 기반 통신

5. 경량화된 배포


MSA와 모놀리식 아키텍처 비교

특징 모놀리식 아키텍처 마이크로서비스 아키텍처
구조 단일 코드베이스로 모든 기능이 통합된 애플리케이션 독립적으로 개발 및 배포 가능한 작은 서비스들의 집합
배포 전체 애플리케이션을 한꺼번에 배포 개별 서비스 단위로 배포 가능
확장성 수직 확장(더 강력한 서버로 업그레이드) 수평 확장(서비스별로 독립적으로 확장 가능)
개발 모든 팀이 동일한 코드베이스에서 작업 각 팀이 독립된 서비스에서 작업
의존성 관리 의존성이 복잡하게 얽힐 가능성 높음 각 서비스가 독립적이므로 의존성 최소화 가능
장애 전파 하나의 장애가 전체 시스템에 영향을 줄 수 있음 특정 서비스 장애가 전체 시스템에 미치는 영향을 최소화할 수 있음
복잡성 단일 애플리케이션이므로 구조는 단순하지만 확장 시 복잡성 증가 분산 시스템이므로 초기 설계 및 운영 복잡성이 높음

MSA의 장점

1. 독립적 배포 및 개발

2. 확장성

3. 장애 격리

4. 폴리글랏 아키텍처

5. 빠른 장애 복구


MSA의 단점

1. 복잡성 증가

2. 서비스 간 통신 비용

3. 데이터 일관성 문제

4. 모니터링 및 디버깅 어려움

5. 초기 설정 및 운영 비용


MSA 구현 시 고려사항

  1. 서비스 분리 전략

    • 각 서비스를 비즈니스 도메인별로 설계하여 높은 응집도낮은 결합도를 유지합니다.
    • DDD(Domain-Driven Design)를 기반으로 서비스 경계를 정의합니다.
  2. 데이터 분리

    • 각 서비스는 고유한 데이터베이스를 사용해야 하며, 다른 서비스와 데이터베이스를 공유하지 않습니다.
    • 데이터 동기화를 위해 이벤트 기반 통신(Kafka, RabbitMQ)을 활용할 수 있습니다.
  3. API 게이트웨이 활용

    • 모든 요청은 API Gateway를 통해 라우팅됩니다. Gateway는 인증, 로깅, 트래픽 관리, CORS 등을 처리합니다.
  4. 서비스 간 통신

    • RESTful API 또는 gRPC를 사용하며, 비동기 작업에는 메시지 브로커(Kafka, RabbitMQ)를 활용합니다.
  5. 자동화된 배포

    • CI/CD 파이프라인을 구축하여, 서비스별로 자동화된 빌드, 테스트, 배포 프로세스를 구현합니다.
  6. 모니터링 및 로깅

    • 모든 서비스의 상태를 실시간으로 모니터링하기 위해 Prometheus, Grafana를 사용합니다.
    • 분산 로그 수집은 ELK(Elasticsearch, Logstash, Kibana) 스택을 활용합니다.

대규모 트래픽 환경에서의 MSA

  1. 독립적 확장성

    • 대규모 트래픽을 처리하기 위해 트래픽이 집중되는 서비스만 독립적으로 확장합니다.
    • 예: 검색 서비스만 트래픽이 몰린다면, 해당 서비스의 인스턴스 수를 늘립니다.
  2. 오토스케일링

    • Kubernetes와 같은 오케스트레이션 도구를 사용하여 자동 확장을 구현합니다.
    • HPA(Horizontal Pod Autoscaler)를 설정해 트래픽 증가에 따라 파드 수를 늘립니다.
  3. 로드 밸런싱

    • 서비스 간 트래픽을 균등하게 분산하기 위해 로드 밸런서를 사용합니다.
    • 클라우드 제공자의 관리형 로드 밸런서(AWS ALB, GCP Load Balancer)와 통합합니다.
  4. 서비스 간 메시징

    • 메시지 브로커(Kafka, RabbitMQ)를 사용하여 트래픽 급증 시에도 비동기로 요청을 처리합니다.
    • 이를 통해 서비스 간 의존성을 줄이고 성능을 최적화합니다.
  5. 캐싱

    • Redis, Memcached 등을 사용하여 데이터베이스 부하를 줄이고, 읽기 성능을 최적화합니다.
  6. 모니터링 및 장애 대응

    • 실시간 트래픽 상태를 Prometheus와 Grafana로 모니터링합니다.
    • 장애 발생 시 즉각적인 복구를 위해 Canary 배포 또는 롤백을 지원합니다.

결론

마이크로서비스 아키텍처는 대규모 시스템의 확장성, 유연성, 가용성을 극대화할 수 있는 강력한 설계 방식입니다. 그러나 초기 설계와 운영의 복잡성을 해결하기 위한 전략이 필수적입니다. 올바른 도구와 프레임워크를 활용하여 MSA를 구현한다면, 대규모 트래픽과 복잡한 요구사항을 효과적으로 처리할 수 있습니다.