오늘은 기업 인프라의 핵심이자 이제는 기본적 기술이 되어버린 MSA에 대해 알아보고자 한다.
개발자 직무 면접에서도 빈번히 등장하며, MSA를 심도깊게 다뤄보진 못했더라도
모든 개발자들이 얕게나마 거쳐갔기 때문이다. (나 포함)
MSA는 API
를 통해 상호작용한다. 각 독립적인 서비스의 접근접을 API 형태로 구성하고,
내부 기능들을 추상화해 외부로부터 hidden
한다.
서비스 간 독립성으로 인해 높은 확장성, 유연성을 가지며
이로 인해, 특정 서비스의 에러에도 전체 시스템이 크게 영향을 받지 않는다.
또한 각 서비스를 독립적으로 배포할 수 있어, 지속적 배포 CD도 가볍게 진행할 수 있다.
하지만, 소규모 서비스가 많아져 각 서비스 간 연결 구축 및 관리가 복잡해지고,
초기 개발 및 통신 등에 시간 소요가 높아진다.
또한 테스팅 단계에서 필수적인 Integration Test, 통합 테스트
가 어렵고
하나의 서비스에 대한 재배포에서 각 서비스들과 정상적 연계를 늘 확인해야한다.
LG CNS
에 따르면 2가지를 MSA 성공의 핵심 요소로 고려해야한다고 한다.
기업이 목표로하는 시스템을 위해 서비스의 크기를 결정하고 검증하는 과정.
목표 설정
단계에선, MSA 도입의 본질을 고민한다.이후 워크숍 형태의 이벤트 스토밍
을 거쳐 적합한 크기로 서비스를 추출한 후
스토리텔링
을 통해 후보 서비스를 골라낸다.
이때, 신규로 추가되거나, 변경이 잦은 업무를 별도 서비스로 분리하고,
부하, 장애 등의 이유로 최우선으로 독립성을 확보해야 하는 서비스를 식별한다.
해당 단게를 거치면 서비스 간 관계를 도식화한다.
서비스 간 통합, 분리의 재정의 및 특정 서비스 중심의 API, Pub/Sub
등 통신 방식 적용 등이 수행된다.
이젠, 마이크로서비스가 독립성을 가질 수 있게 아키텍처를 정의, 구상하는 작업이 요구된다.
이때, 매우 중요한 개념이 API 우선 설계(API First Design) 이다.
이는 모든 개발 프로세스에서 API를 첫 번째 우선순위로 두어 개별 서비스의 내부 설계 이전
API를 우선 정의함을 통해 마이크로서비스 간 원활한 호출, 독립적 작동을 보장하는 것이다.
하지만, MSA에 API 우선 설계를 적용하려면 몇 가지 문제에 직면하는데,
그 중 대표적인 것이 여러 서비스를 포괄하는 조회성 업무이다.
한 화면에서 다양한 서비스의 데이터를 보여준다면, Client의 호출이 잦아지고
데이터 조합 작업을 인한 성능 하락을 야기하기 때문이다.
이를 해결하기 위해 API Composition
, CQRS
패턴을 활용할 수 있다.
Server Side
에선 API Composition
으로 다수의 서비스를 호출하고,
해당 데이터를 Client로 제공해 처리 시간 단축과 성능 개선의 이점을 갖는 것이다.
이젠, 내가 MSA를 어떻게 접해왔는 지 확인해보자
대표적으로 COCO
서비스는 MSA를 기반으로 설계되었다.
완벽한 MSA는 아니지만, 핵심 기능들을 따로 분리해 설계, 개발되었다.
특히 게시판 기능, 유저 개인정보 등 단순한 Client의 요청은
React → FastAPI ↔ MySQL
간 통신으로 구현했지만,
핵심이되는 문제 풀이 및 채점 기능은
React → FastAPI의 API Composition ↔ isolate & redis
의 과정으로 구현되었다.
외에도 AI 관련 기능을 서비스로 따로 개발해 FastAPI
위에서 API Composition
방식으로 구현했다.
이처럼 MSA는 이제는 애플리케이션 구조 설계의 기본이 되었으며,
기업이나 개인이 프로젝트, 시스템을 구현함에 있어 가장 먼저 고려해야 될 부분이라고 생각한다.
하지만, 그만큼 테스팅 단계, 배포 단계, 통합 단계에서 더 많은 노력과 고려사항이 발생하기 때문에 더 많은 공부, 경험이 요구된다고 바라봐야 할 것 같다.
[참고자료]