전통적인 소프트웨어 프로그램 디자인 방법론
한 개의 서비스 안에서 개별 컴포넌트 모두 서로 결합되어 하나의 큰 모듈로 존재하고 컴포넌트들은 내부적으로 잘 정의된 인터페이스를 통해 상호 연결되어 있는 아키텍처
내부 컴포넌트들의 강한 결합도로 인하여, 개발자가 잘못된 코를 배포하거나 트래픽 증가로 인해 서비스 성능에 문제가 있을 때 서비스 전체의 장애로 확대되는 상황이 발생할 수 있다.
여러 컴포넌트들이 하나의 서비스 안에 강하게 결합되어 있어 서비스의 변경이 매우 어렵고, 수정 시 어떤 장애를 일으켜 영향을 미칠지 파악하기도 어렵다.
모놀리틱 아키텍처는 하나의 서비스이기 때문에 반드시 서비스 전체에 대해 서비스 확장을 해야한다.
서비스의 안정성을 위해 일부의 기능을 수정하고 배포할 때마다, 단위 테스트(Unit Test), 회귀 테스트(Regression Test) 를 수행한다.
모노리틱 아키텍처에서는 코드베이스 전체를 실행하면서 코드를 테스트하는데, 코드 베이스의 크기가 커지먄 테스트 비용이 증가하게 된다.
다수의 팀이 같은 GIT 레포지토리를 사용하며 배포를 기다리기 때문에 조직이 크면 클 수록 배포대기 시간이 비약적으로 증가한다.
자유도가 높은 소프트웨어 프로그램 디자인 방법론
복잡성이 낮은 기능들을 제공하는 독립적인 서비스 여러 개를 느슨하게 결합하고 네트워크를 통해 서비스들끼리 통신하게 만들어 하나의 서비스를 구성해내는 아키텍처
구조적으로 모노리틱 아키텍처보다는 복잡하지만, 각 서비스를 독립적으로 관리하고 테스트할 수 있다는 장점이 있다.
일반적인 MSA는 분리되어 있는 도메인들끼리 RESTful API를 통해 상호 통신한다.
특정 API를 사용하기 위해 모든 클라이언트들은 HTTP 통신을 하는 모듈을 만들고, JSON 형태의 API 요텅을 만든 후, 요청을 오브젝트로 매핑해야 한다.