2 분 소요

MSA 아키텍처와 Monolithic Architecture를 정리해 보려고 한다.


Monolithic Architecture

전통의 아키텍처를 지칭하는 의미로 생겨난 단어로 소프트웨어의 모든 구성요소가 한 프로젝트에 통합되어 있는 단순한 형태이다.

그 자체로 내부 요소 간의 의존성이 강한 특징을 가지고 있다. 따라서 구조적으로 결합도가 매우 높다.



장점

  • 서비스 간 호출이 하나의 프로세스 내에서 이루어져 속도가 빠름
  • 개발 초기에 단순한 구조를 가지고 개발에 용이함
  • 서비스가 통합되어 있어 내부 통신 시스템에 대해서 간편함

단점

  • 프로젝트의 규모가 커질수록 애플리케이션의 구동 시간, 빌드, 배포 시간이 많이 소요됨
  • 작은 수정 사항이 있어도 전체를 다시 빌드하고 배포해야 됨
  • 많은 양의 코드가 몰려 있어 이해와 유지 보수가 어려움
  • 일부분의 오류가 전체의 영향을 미칠 수 있음



MSA(Micro Service Architecture)

Monolithic Architecture의 문제점을 보안하는 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 소프트웨어 개발 기법이다.

간단하게 예시를 들면 네이버에서 웹툰, 메일, 날씨로 파트로 서비스 영역을 나누어 독립적인 모듈로 만든다.

따라서 어떠한 서비스에 문제가 생기면 문제의 서비스 부분만 사용하지 못하고 나머지 서비스는 사용이 가능하다.



장점

  • 기능별로 개발이 가능하고 작업 할당을 서비스 단위로 효율적으로 나눌 수 있음
  • 새로 추가나 수정사항이 있는 서비스 부분만 빠르게 빌드, 배포가 가능함
  • 유지 보수가 편리함

단점

  • 서비스가 분리되어 있어 테스트와 트랜잭션의 복잡도가 증가됨
  • 모든 서비스를 모니터링하는 오버헤드가 증가함
  • 서비스 간 호출시 API를 사용해 통신하므로 네트워크 통신에 의한 오버헤드가 발생함



MSA에서 API gateway 필요성

많은 서비스로 나누어지면 각각의 서비스에 인증/인가 처리, API 호출 기록 관리, 클라이언트에서 여러 서비스에 대해 번거로운 호출을 해야되는 비효율적인 문제가 발생한다.

이때 API Gateway를 사용하면 서버 앞단에서 모든 API 서버들의 엔드 포인트를 단일화해주는 또 다른 서버 역할을 한다.



API Gateway 기능 정리

  • 인증 및 인가

    • 인증/인가에 대한 소스 중복 및 로깅 모니터링 어려움 해소 가능
  • 요청 절차의 단순화

    • 여러 서비스를 대상으로 하는 기능을 사용할 때 여러 번 요청해야 할 일을 한 번에 받아서 처리가능
  • 라우팅 및 로드밸런싱

    • 클라이언트로부터 접수된 메세지에 따라 API 호출을 적절한 서비스에 라우팅, 부하 분산 가능
  • 서비스 오케스트레이션

    • 오케스트레이션은 여러 개의 서비스를 묶어 새로운 서비스를 만드는 개념
  • 서비스 디스커버리

    • 동적인 환경에서 각 서비스를 호출하기 위해 서비스마다의 IP 주소와 포트 번호를 알고 찾아내는 기능

    • 서버를 기준으로 아니면 클라이언트 기준으로 할지 선택해 서비스 디스커버리를 구현할 수 있음



API Gateway 적용시 고려해야할 사항

  • API Gateway를 내부 서비스와 결합해 SOA에서의 ESB에서 발생한 문제점을 다시 발생시킬 수 있다.

    SOA에서 ESB의 문제점 정리(차후 정리 예정)

  • API Gateway가 병목지점이 되어 성능저하가 일어날 수 있으므로 적절한 Scale-out이 필요하다.

    scale-out은 서버의 대수를 늘려 처리 능력 향상, scale-up은 서버 자체를 증강해 처리 능력 향상

  • API Gateway라는 추가적인 계층이 만들어지는 것으로 그만큼 네트워크 지연이 발생한다.



차이점 정리

각 프로젝트의 상황에 맞게 적절한 아키텍쳐를 고르는 것이 좋다.

초창기 간단한 프로젝트라면 Monolithic 아키텍쳐를 사용하는 것이 간편하고 사용하기 좋지만 프로젝트의 규모가 커지고 복잡해 질수록 여러가지 유지보수와 테스트를 하기엔 어렵기에 MSA 방법을 쓰는 것이 좋다.

업데이트: