[MSA] MSA가 뭔지 모르겠어
Spring과 디자인 패턴을 공부하면서 반복적으로 언급되는 공통의 목표는 결합도를 끊는 일이다.
기존에는 프로젝트를 Monolithic 구조로 구성해 왔지만 MSA에 대해 알게 되면서 공부한 점들을 정리하자.
모놀리틱과 마이크로서비스 각각 장단점이 있으므로 맞는 걸로 골라 쓰면 될 것 같다.
Monolithic Architecture
High Cohesion and Low Coupling.
소프트웨어 = 단일 프로젝트
소프트웨어의 모든 구성요소가 한 프로젝트에 통합되어 있는 구조. 개발이 완료된 어플리케이션을 하나의 결과물로 빌드해서 배포하는 방식이다. Vue.js나 React 프로젝트를 Spring API 프로젝트의 resources에 빌드해 넣어서 한 번에 돌리는 방식이 Monolithic에 속한다.
장점
- 배포가 간단하다.
- 단일 애플리케이션에 대한 통합 테스트만 진행하면 된다.
- 디버깅과 구현이 편하다.
단점
- 결합도가 높다. 부분적인 장애로 인해 서비스 전체가 스탑할 수 있다. 여러 컴포넌트가 하나의 서비스에 강하게 결합되어 있기 때문에 부분 수정이 전체에 영향을 끼칠 수 있다.
- 부분 Scale-out 불가능. 모든 서비스가 한 프로젝트에 묶여 있으므로 사용되지 않는 서비스도 Scale-out된다. 같은 맥락에서 배포 시간이 오래 걸린다.
- 프레임워크와 언어에 종속적이다. 한 서비스가 프레임워크 기반으로 돌아가므로 모듈도 해당 프레임워크의 언어를 따라야 한다.
이런 문제점들을 보완하기 위해 MSA가 등장함.. 기존의 특정한 물리적인 서버에 서비스를 올리던 on-promise 서버 기반의 Monolithic Architecture에서 이제는 클라우드 환경을 이용하여 서버를 구성하는 MicroService Architecture로 많은 서비스들이 전환되고 있다.
MSA(MicroService Architecture)
마이크로서비스란 각자의 기능을 수행하는 서비스들로 구성된, 각각 배포가 가능한 독립 모듈을 뜻한다. 완전히 독립되어 있으므로 각각의 마이크로서비스가 서로 다른 기술 스택(언어, 프레임워크, 데이터베이스 등)을 아무런 문제 없이 사용할 수 있다. SOA보다 더욱 세분화된 설계 방식.
장점
- 각 모듈을 점진적으로 배포할 수 있다.
- 시스템 전체에 영향을 미치지 않고도 각 모듈을 확장할 수 있다.
- 모듈의 개별 테스트와 업데이트가 가능하다.
- 여러 개발스택(프레임워크, 언어, 기술 등)을 유연하게 사용할 수 있다.
Monolithic의 단점들을 보완했다고 볼 수 있지만 MSA가 무조건적으로 장점을 가지는 건 아니다.
단점
- 첫 배포가 정말 어렵고, 분산 시스템을 디버깅하는 일이 엄청 어렵다.
- 구성과 모니터링, 관리가 어렵다. 서비스 구조가 복잡한 만큼 개발자가 따로 관리해야 하는 부분이 많다. 내부 시스템의 통신, Transaction등을 어떻게 유지할지 고민해야 한다.
- 통합 테스트가 어렵다. 각 서비스들의 연계가 제대로 이루어지는지 테스트하는 과정이 까다롭다.
- 엄청 복잡하다.
총합해 보자면 회사 입장에서는 좋은데 개발자 입장에서는 어렵다는 뜻인가?
오류 나면 잡기가 어려우니까 health check용 api 하나씩 만들어 놓고 죽었나 체크하거나 로그 띄워서 확인한다고 한다.
MSA Component와 구성
MSA의 core component가 뭔지 검색해 봤는데 의견이 다 갈렸다. API Gateway와 서비스 모듈, 그리고 컨테이너만 있으면 MSA로 치는 글도 있는가 하면 메세지 큐와 자동화 도구까지 포함시켜야 한다는 글도 있었다. 그냥 구성하기 나름이라고 하는데 너무 복잡한 구조를 골라서 공부하겠다고 달려들었다가는 다 꼬일 것 같아서 손 댈 수 있는 친구들만 구성해 보기로 했다.
+) 윗선에서는 그냥 API가 개별 서버에서 따로 돌면 MSA라고 하는 경우도 있다고 함...
근데 진짜 뭐가 뭔지 모르겠다. 위에 있는 사진에서는 메시지 큐가 없는 것 같은데 아무리봐도 MQTT 써볼 필요가 있는 것 같으므로 나는 할 거다... 그것이 COOL이니까
마이크로서비스가 이제 뭐고 모놀리틱과 비교해 어떤 장단점을 가졌는지 이제 대강 알긴 하겠는데 그래서 여기다 무슨 서비스를 써야 하고 뭐가 뭔지 감이 안 잡힌다. 구글만 대강 돌아도 마이크로서비스가 핫하긴 한데 그거에 대해 서명하라고 하면 죽어버리겠다는 밈이 넘쳐남.
-> API 모듈별로 빌드가 가능한 마이크로서비스 만들어서 MQ랑 Gateway 쓰고 health check하는 거 해보고 싶음.
+ 계속 공부해나가면서 추가하거나 변경될 수 있음
참고