MSA 소개

Published on
3 mins read

MSA 아키텍처란?

1. 모놀리식 아키텍처

  • 모놀리식 아키텍처는 마이크로서비스(MSA) 아키텍처에 반대되는 개념으로 , 애플리케이션의 모든 구성요소가 한 프로젝트에 통합되어 있는 형태를 말한다.

장점

  • 개발 초기에 단순한 아키텍처 구조로 인해 개발에 용이하다.
  • 어떤 서비스든지 개발되어 있는 환경이 같아서 복잡하지 않다.
  • 배포가 간단하다.
  • 확장성이 쉽다.
  • 로드밸런스를 이용하여 로드 부하를 나눠 가지는 방식으로 진행한다.
  • 쉽게 고가용성 서버 환경을 만들 수 있다.
  • End-to-End 테스트가 용이하다.

단점

  • 프로젝트의 규모가 커짐에 따라 애플리케이션 구동 시간이 늘어나고 빌드 및 배포 시간이 길어진다.
  • 조그마한 수정 사항이 있어도 전체를 다시 빌드하고 배포해야 한다.
  • 많은 양의 코드가 몰려 있어서 개발자가 모든 코드를 이해하기 힘들며, 유지 보수가 어렵다.
  • 일부분의 오류가 전체에 영향을 미친다. (장애가 전파된다.)
  • 기술 스택이 한 번 정해지면 바꾸기 어렵다.
  • 전체 애플리케이션 확장은 쉽지만, 부하 분산을 위해 각 컴포넌트를 독립적으로 확장하기 어렵다.

2. MSA 아키텍처

  • MSA 아키텍처는 하나의 큰 애플리케이션을 여러 개의 작은 애플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 형태를 말한다.

  • MSA를 설명하는 가장 핵심적인 문구 ( 마틴 파울러 )

    • small services , each running in its own process (스스로 돌아 갈 수 있는 작은 서비스)
    • independently deployable(독립적 배포가능)

마이크로 서비스의 특징

  • 각각의 서비스는 그 크기가 작을 뿐, 서비스 자체는 하나의 모놀리식 아키텍처와 유사한 구조를 갖는다.
  • 각각의 서비스는 독립적으로 배포가 가능해야 한다.
  • 각각의 서비스는 다른 서비스에 대한 의존성이 작아야 한다.
  • 각 서비스는 개별 프로세스로 구동되며, REST API와 같은 가벼운 방식으로 통신되어야 함.

장점

  • 배포 관점

    • 서비스 별 개별 배포가 가능하다. (배포 시 전체 서비스의 중단이 없음.)
    • 독립 배포가 가능하므로 개발자의 자율성이 증가한다. (내가 A 기능 다 만들었고, 다른 사람이 B 기능 못 만들었으면, 나는 그냥 놀아도 됨.)
    • 요구 사항을 신속하게 반영하여 빠르게 배포할 수 있다.
  • 확장 관점

    • 특정 서비스에 대한 확장성이 용이하다.
    • 클라우드 사용에 적합하다.
  • 장애 관점

    • 장애가 전체 서비스로 확장될 가능성이 적다.
    • 부분적 장애에 대한 격리가 수월하다.
  • 코드 / 유지 보수 관점

    • 팀 별로 프로젝트가 분리되어 있으므로 코드의 이해도가 증가하고, 그에 따라 유지 보수하기 쉽다.
    • 신기술의 적용이 유연하고, 서비스를 polyglot하게 개발 및 운영할 수 있다.
    • polyglot 개발: 여러 프로그래밍 언어, 패러다임 등을 사용

단점

  • 성능 관점
    • 서비스 간 호출 시 API를 사용하기 때문에 통신 비용 및 지연 시간이 증가한다.
    • 데이터 관리 관점
    • 데이터가 여러 서비스에 걸쳐서 분산되므로 한 번에 조회하기 어렵고, 데이터의 정합성 또한 관리하기 어렵다.
  • 테스트 / 트랜잭션 관점
    • 단위 테스트는 쉽지만, 통합 테스트 및 End-to-End 테스트 단위로 들어가면 여러 서비스의 API를 검증해야 하므로 시간과 비용이 많이 든다.
    • 각 서비스 별로 데이터베이스가 있으므로 트랜잭션을 구현하기 까다롭다.
    • 아키텍처가 다소 복잡하므로 개발 및 관리가 어렵고, 비용이 많이 든다.

언제 모놀리식 아키텍처를 사용하고, 언제 MSA 아키텍처를 사용해야 하는가?

초기 시작은 프로젝트의 규모가 작은 경우가 많으므로 모놀리식 아키텍처로 사용하다가 다음 관점들을 비교하여 이득이 된다면 MSA 아키텍처로 전환하는 것이 좋다.

  • 비용: MSA 아키텍처를 도입할 경우, 모놀리식 아키텍처에 비해 비용을 얼마나 절감할 수 있는가?

  • 개발 생산성: 마이크로 서비스를 요구할 만큼 시스템 복잡도가 높은가? 또는 복잡도를 지나치게 높인 마이크로 서비스가 생산성을 저해하고 있진 않은가?

  • 운영: 개발 팀에게 개발과 운영을 동시에 할 만큼 인프라가 준비되어 있는가? 또는 개발 인력이 마이크로 서비스를 관리할 역량이 있는가?

  • 배포: 배포를 충분히 자주 하고 있는가? MSA는 빠른 변화에 대응하기 위해 도입하는 것인데, 회사마다 배포 일이 정해져 있고, 배포가 가끔 일어난다면 효율이 떨어진다.