MSA란, MicroService Architecture의 줄임말이다.
이는 Framework의 구조의 종류이며, 각 기능이 독립 배포가 가능함을 의미한다.
Monolithic Architecture
먼저, MSA가 왜 등장하게 되었는지 부터 알아보자.
원래 Framework의 구조는 Monolithic 했다.
이 구조는 SW의 모든 구성요소가 한 프로젝트 안에 통합된 형태를 말한다.
웹 개발을 예로 들면, 하나의 패키지로 모두 개발을 해 배포하는 웹이 되겠다.
하지만, 엄청나게 큰 대규모의 서비스나 개발이 이루어지는 프로젝트에서는, Monolithic Architecture은 반드시 한계를 보인다.
- 부분 장애가 전체 서비스의 장애가 되어 버린다.
- 개발자의 잘못된 코드 배포는 트래픽 증가로 서비스 전체의 장애를 부른다.
- 부분적인 Scale-out 이 어렵다.
- Scale-out : 여러 Server로 나누어서 일을 처리하는 방식
- 서비스의 변경이 어려우며, 수정 시 장애의 영향도 파악하기가 쉽지 않다.
- 배포 시간이 오래걸린다.
- 패키지의 파일이 커지면 커질 수록 작은 변경에도 배포에 많은 시간이 걸린다.
- 요즘 같이 CI/CD를 통한 빠른 배포를 지향하는 추세와는 맞지 않는 방식이다.
- 한 Framework와 언어에 종속적이다.
- Spring을 사용하기로 결정했다면, 그 Framework밖에 사용할 수가 없게 된다!
- 예를 들어, Blockchain 연동 모듈은 Node.js를 일반적으로 사용하는데, 그럴 수가 없는 것이다.
MSA의 특징
MSA는 API를 통해서만 상호작용이 가능한 구조이다.
즉, 서비스의 Endpoint를 API 형태로 외부에 노출함으로써 접근성을 높이며,
세부 사항은 모두 추상화 시켜서 몰라도 사용은 가능하도록 구현한다.
내부 로직, DB, 품질 유지 체계 등 기술적 부분은 당연히 API에 의해 철저히 가려진다.
제대로 된 MSA는, 목표는 하나지만 자기가 개발을 맡은 서비스만 책임을 진다.
또한, 여러 어플리케이션에서 재사용이 가능하도록 개발을 할 수 있어야 한다.
MSA의 장점
각 서비스는 모듈화가 되어 있으며, RPC 또는 Message-driven API 로 통신을 한다.
각각의 개별 서비스 개발을 빠르게 진행하며, 쉬운 유지보수가 가능하다.
팀 단위로 사용 가능한 기술 스택을 적절한 수준에서 자유롭게 선택이 가능하다.
Spring 기반으로 개발을 했더라도, MSA에 따르면 Node.js의 블록체인 기술과 연동이 가능하다.
MSA는 서비스 별로 해당하는 부분만 독립적으로 배포하므로, 배포가 매우 빠르며 편리하다.
또한 각각 서비스의 부하 정도에 따라 Scale-out이 가능하다. 따라서 성능적으로 상당히 이득이다.
MSA의 단점
Monolithic Architecture에 비해서 상대적으로 매우매우 복잡하다.
서비스가 모두 분산이 되어서 개발자는 내부 시스템 통신에 신경을 써야한다.
또한, 통신에 장애와 서버의 부하 등이 있을 경우 Transaction 유지에 대해서도 결정해야 한다.
Monolithic은 단일 Transaction만 유지하면 됐지만, MSA에서는 그것이 불가능하다.
또한, 모두 다른 환경에서 개발하기 때문에 통합 테스트가 매우 어렵다.