CS & SW & IT 용어

[MSA 살펴보기] (feat. Monolithic)

Haksae 2022. 4. 24. 22:47

1. MSA 등장 배경 및 Monolithic

 

1) MSA 등장 배경

  • 80년대 초, 큰 규모의 시스템을 설계할 때 직면할 수 있는 공통 문제를 해결하기 위해서 아키텍쳐나 패턴의 필요성이 대두되었다.
  • 가장 처음 등장한 용어는 Software Architecture였고, 그 후로 Monolithic Architecture, SOA, MSA 등 아키텍처 용어들이 탄생하게된다.
Software Architecture : 소프트웨어 요소와 이들 요소의 외부 속성 그리고 이들 사이의 관계를 구성하는 시스템의 구조
서비스 지향 아키텍처(Service Oriented Architecture): 대규모 컴퓨터 시스템을 구축할 때의 개념으로 업무상 일 처리에 해당하는 소프트웨어 기능을 서비스로 판단하여 그 서비스를 네트워크상에 연동하여 시스템 전체를 구축해 가는 방법론

2) Monolithic Architecture

MSA와 가장 대조되는 것은 Monolithic Architecture이므로, 이를 먼저 살펴보겠다.

 

Monolithic Architecture란, 소프트웨어의 모든 구성요소가 한 프로젝트에 통합되어 있는 형태를 뜻한다.
  • 즉 프로젝트를 하나로 패키징하여 진행하고 배포하는 형태의 아키텍쳐입니다.

장점

  • Monolithic Architecture의 가장 큰 장점은 심플함이다.
  • 간단한 아키텍쳐이므로 개발, 빌드, 배포, 테스트, 유지보수가 용이하다.
  • 소규모 프로젝트에 합리적이다.

단점

  • 부분 장애가 전체 서비스의 장애로 확대될 수 있고, 서비스/프로젝트가 커지면 커질수록 시스템 구조 및 문제 파악에 어려움이 있을 수 있다.
  • 빌드 시간 및 테스트 시간, 배포시간이 기하급수적으로 늘어난다. (CI,CD가 어렵다)
  • 모든 모듈이 하나의 프로세스로 동작하기 때문에, 부분의 장애가 전체 서비스의 장애로 이어지는 경우가 발생한다.
  • 부분적인 확장(Scale-out)이 어렵다.
  • 하나의 프레임 워크와 언어에 종속적이다.

 

2. MSA (MicroService Architecture)

  • 위에서 설명했듯이 MSA는, 모든 기능을 수행하는 어플리케이션을 구축하는 Monolithic Architecture와 대조되는 개념이다.
  • MSA의 가장 기본적인 철학은 "단일 책임 원칙", 즉 "하나의 Service는 한 가지 일만 잘 처리하자"이다.
  • 큰 문제들을 작은 문제로 분해하여 해결하는 것이며, 작게 나뉘어진 서비스가 서로에게 영향을 미치지 않게 독립적으로 역할을 수행하게 만드는 것이다.
  • 독립적으로 나눈 각각의 서비스는 그 크기가 작을 뿐, 서비스 자체는 하나의 Monolithic Architecture와 유사한 구조를 가진다.
  • 각각의 서비스는 독립적으로 배포가 가능해야하고, 다른 서비스에 대한 의존성이 최소화 되어야 한다. (서로에게 영향을 최소화하기 위해 분산 데이터데이스를 둬야한다.)
  • 또한 각각의 서비스는 개별 프로세스로 구동 되며, REST와 같은 가벼운 방식으로 통신 되어야한다.
  • 더불어 MSA는 CI, CD와 자동화된 테스트도 있어야 한다.

 

1) MSA의 장점

MSA는 서비스가 커지면서 생겼던 Monolithic Architecture의 문제점들을 어느정도 보완해준다.

  • 복잡성의 문제
    • 서비스가 커져도 각각의 서비스가 모듈화 되어있어 복잡성의 문제가 어느정도 해결된다.
    • 이로 인해 개별의 서비스 개발을 빠르게 할 수 있고, 유지보수도 쉽게 할 수 있다.
  • 배포의 관점
    • 서비스 별 개별 배포 가능(배포 시 전체 서비스의 중단이 없음)
    • 서비스별 요구사항을 신속하게 반영하여 빠르게 배포할 수 있음
  • 확장의 관점
    • 특정 서비스에 대한 확장성이 용이함 (각각 서비스 부하에 따라 개별적으로 확장)
    • 클라우드 사용에 적합한 아키텍쳐
  • 장애의 관점
    • 장애가 전체 서비스로 확장될 가능성이 적다.
    • 부분적 장애에 대한 격리가 수월하고, 서비스를 담당한 팀 단위로 해결 될 수 있다.

2) MSA의 단점

  • 복잡성의 문제
    • Monolithic Architecture와는 다른 차원의 복잡성이다. (Monolithic Architecture는 하나가 큰 덩어리여서 복잡하였다)
    • MSA는 개별적 서비스로 나뉘어져있어, 내부 시스템의 통신을 어떻게 가져가야할지와 같은 문제들을 구현하는 복잡성들이 존재한다.
  • Transaction의 일관성 유지의 어려움
    • MSA는 서비스가 분산되어 있기 때문에 비지니스 트랜잭션을 유지하는게 어렵다.
    • 이로 인해 트랜잭션의 복잡도가 증가한다.
  • 통합 테스트의 어려움
    • 개발 환경과 실제 운영환경을 동일하게 가져가는게 어려움으로, 통합 테스트가 어렵다.
  • 배포의 어려움
    • 실제 운영 환경에 대해서 배포하는 것이 어렵다.
    • 가령 하나의 서비스에 대해서 재배포를 한다면, 다른 서비스들과 연계가 정상적으로 이루어져있는지 먼저 확인해야하는데 이것이 쉽지 않다.

 

참고

https://martinfowler.com/articles/microservices.html

https://medium.com/@Dopedev/microservice-architecture%EB%9E%80-ca9825087050

https://velog.io/@tedigom/MSA-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-2-MSA-Outer-Architecure

https://levelup.gitconnected.com/monolithic-vs-microservices-architecture-b333c8754187

https://velog.io/@tedigom/MSA-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1-MSA%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-3sk28yrv0e