MSA 도입의 목적과 고려사항

wontaekoh·2024년 11월 24일

항해 플러스

목록 보기
6/7
post-thumbnail

📌 MSA란 무엇인가?

마이크로서비스 아키텍처(MSA, Microservices Architecture)는 하나의 큰 애플리케이션을 독립적이고 자율적인 여러 작은 서비스로 분리하여 개발하고 운영하는 아키텍처입니다. 각 마이크로서비스는 특정 비즈니스 기능을 담당하며, 독립적으로 배포 및 확장이 가능합니다. MSA는 단순한 트렌드가 아닌, 확장성과 변화 대응력을 높이기 위한 전략적 선택입니다.

📌 왜 MSA를 도입해야 할까?

MSA를 도입하려는 이유는 명확해야 합니다. 단순히 다른 기업들이 도입했기 때문에 따라 하는 것은 큰 위험을 초래할 수 있습니다. 특히 프로젝트 초기부터 MSA를 도입하는 것은 장점보다는 단점이 많은 경우가 많다고 생각합니다. MSA는 명확한 필요성과 목적이 있을 때 도입하는 것이 중요합니다. 특히 다음과 같은 경우 MSA를 고려할 수 있습니다:

  • 비즈니스의 빠른 성장: 더 많은 기능을 신속히 추가하고 변경해야 할 때.
  • 확장성 문제 해결: 특정 기능의 부하가 많아, 해당 기능만을 독립적으로 확장해야 할 때.
  • 개발팀의 독립적 작업 필요: 여러 팀이 서로의 영향을 최소화하면서 병렬로 개발을 진행하고자 할 때.

이를 위해 MSA의 특성을 잘 이해하고 여러 측면에서 신중히 고려하는 것이 중요합니다.

📌 기술적 관점을 넘어선 조직적 변화

MSA는 단순히 기술적 전환만으로는 성공하기 어렵습니다. 조직의 구조와 팀 구성도 중요한 역할을 합니다. MSA를 성공적으로 도입하기 위해서는 다음과 같은 조직적 변화가 필요합니다:

  • 비즈니스 도메인 중심 팀 구성: 각 팀은 특정 비즈니스 도메인을 책임지고 해당 도메인의 모든 기능을 개발하고 운영할 수 있어야 합니다.
  • 자율적인 팀 운영: 팀이 독립적으로 결정하고 배포할 수 있는 환경이 마련되어야 합니다. 이를 통해 의존성을 줄이고 개발 속도를 높일 수 있습니다.

이러한 조직적 준비 없이는 MSA의 장점이 오히려 복잡성과 혼란으로 이어질 수 있습니다.

📌 MSA의 장단점

MSA는 많은 장점을 가지고 있지만, 그만큼 단점도 존재합니다. 장단점을 균형 있게 고려하여 도입 여부를 판단해야 합니다.

장점

  • 독립적 배포: 각 서비스는 독립적으로 배포 및 수정이 가능하여 시스템 전체에 영향을 주지 않고도 변경을 할 수 있습니다.
  • 확장성: 서비스 단위로 개별적인 확장이 가능해 특정 서비스의 트래픽이 증가할 때만 확장할 수 있습니다.
  • 유지보수성: 서비스가 작고 명확하게 분리되어 있어 코드의 이해와 유지보수가 용이합니다.

단점

  • 복잡성 증가: 여러 서비스로 분리됨에 따라 서비스 간 통신, 데이터 일관성 유지 등의 복잡성이 증가합니다.
  • 배포 및 모니터링 어려움: 수십 개의 서비스가 독립적으로 운영되므로 배포 파이프라인 설정과 모니터링이 더 어려워집니다.
  • 통신 비용 증가: 서비스 간 네트워크 통신이 빈번하게 일어나기 때문에 통신 비용과 지연이 발생할 수 있습니다.

📌 MSA 도입에 필요한 기술들

MSA를 성공적으로 운영하기 위해서는 다양한 기술들이 필요합니다:

  • API 게이트웨이: 클라이언트 요청을 각 마이크로서비스로 라우팅하고 인증, 로깅 등을 담당합니다.
  • 서비스 메시: 각 마이크로서비스 간의 통신을 제어하고 모니터링하는 역할을 하며, 주로 서비스 간 보안, 로드 밸런싱, 장애 복구 등을 지원합니다.
  • DevOps와 CI/CD: 빈번한 배포를 자동화하고 신속하게 진행하기 위해 지속적 통합/지속적 배포(CI/CD) 환경이 필수적입니다.
  • 로그 관리와 모니터링: 분산된 여러 서비스의 로그를 수집하고 분석하여 서비스 상태를 모니터링합니다. Prometheus, Grafana, ELK 스택 등이 자주 사용됩니다.

📌 분산 트랜잭션 관리: 2PC vs SAGA

MSA에서는 데이터 일관성을 보장하기 위해 분산 트랜잭션 관리가 중요합니다. 대표적인 방법으로 2PC(Two-Phase Commit)와 SAGA 패턴이 있습니다.

2PC (Two-Phase Commit)

2PC는 강한 일관성을 보장하지만, 참여 서비스가 많아질수록 성능 문제가 발생하고 시스템의 복잡성이 증가합니다. 따라서 MSA 환경에서는 잘 사용되지 않는 경우가 많습니다.

SAGA 패턴

SAGA는 트랜잭션을 여러 단계로 나누어 각각의 서비스가 독립적으로 처리하게 하는 방식입니다. SAGA는 주로 Choreography 방식과 Orchestration 방식으로 구현됩니다:

  • Choreography: 각 서비스가 이벤트를 직접 발행하고, 다른 서비스가 이를 구독하여 필요한 작업을 수행합니다. 단점은 이벤트의 흐름이 복잡해질 수 있다는 것입니다.
  • Orchestration: 중앙의 오케스트레이터가 각 트랜잭션 단계를 순차적으로 조정합니다. 이를 통해 흐름을 명확히 관리할 수 있지만, 중앙 집중적 제어가 발생합니다.

📌 아웃박스 패턴을 통한 데이터 일관성 유지

아웃박스 패턴은 트랜잭션 내에서 이벤트와 데이터를 함께 저장하여 데이터 일관성을 유지하는 데 유용합니다. 트랜잭션이 완료되면 아웃박스에 저장된 이벤트를 별도의 프로세스를 통해 메시지 브로커(Kafka 등)로 전송합니다. 이를 통해 서비스 간의 비동기 통신에서도 데이터 손실이나 불일치를 방지할 수 있습니다.

📌 장애 대응책

MSA에서는 장애가 발생했을 때 이를 빠르게 감지하고 대응하는 것이 중요합니다. 장애 대응을 위해 다음과 같은 전략들이 사용됩니다:

  • 서킷 브레이커: 특정 서비스가 과부하 상태일 때 요청을 차단하여 시스템 전체의 장애로 확산되는 것을 방지합니다.
  • 리트라이 및 타임아웃: 네트워크 오류나 일시적인 장애에 대비해 리트라이 메커니즘을 구현하고, 응답 지연에 대한 타임아웃 설정을 통해 시스템의 안정성을 높입니다.
  • 포괄적인 모니터링과 알림: 모든 마이크로서비스의 상태를 모니터링하고, 문제가 발생했을 때 즉시 알림을 받는 체계를 갖추어야 합니다. Prometheus와 Grafana 같은 도구를 활용해 실시간 모니터링을 구성할 수 있습니다.

📌 마무리

MSA는 시스템의 유연성과 확장성을 높일 수 있는 강력한 아키텍처 패턴입니다. 하지만 이를 성공적으로 도입하기 위해서는 기술적 준비뿐 아니라 조직적 변화, 서비스 간 통신 관리, 장애 대응책 등 여러 요소를 신중하게 고려해야 합니다. MSA의 장점을 극대화하고 단점을 최소화하려면 기술적 도구와 전략을 잘 조합하고, 팀이 자율적으로 운영될 수 있는 환경을 만드는 것이 중요합니다.

MSA 도입을 고려하고 있다면, 위에서 언급한 요소들을 종합적으로 분석하고 조직의 상황에 맞는 최적의 방법을 찾아가는 과정이 필요합니다.

➡️ 다음으로

다음 포스팅에서는 현재 항해 플러스 교육과정을 통해 진행하고 있는 이커머스 프로젝트를 모놀리식 구조에서 MSA 구조로 리팩터링하면서 사용한 기술 스택을 정리하고, 주요 코드를 보여드리며 설명하는 과정을 다룰 예정입니다.

profile
주니어 백엔드 개발자, 오원택입니다!

0개의 댓글