마이크로서비스 (Microservices)
"In short, the microservice architectural style is an approach to developing a single application as a suite of small services."
— 마틴 파울러(Martin Fowler)의 마이크로서비스 정의문 중.
"기존 모놀리식 아키텍처의 스파게티 코드를 그대로 둔 채 MSA를 적용하면, 단지 네트워크를 타고 흘러 다니는 '분산 스파게티 공포'를 마주할 뿐이다." 서비스가 50개인데 장애가 나면 어디서 에러가 터졌는지 아무도 모른다. 결국 Zipkin이나 Jaeger를 띄우느라 야근을 해야 한다.(...)
1. 개요
마이크로서비스 아키텍처(MSA)는 거대하고 단일한 애플리케이션(Monolithic)을 독립적으로 배포 및 실행 가능한 작은 서비스 단위로 쪼개어 상호 작용하게 만드는 설계 기법이다. 현대의 대규모 트래픽을 처리하는 클라우드 컴퓨팅 생태계에서 절대적인 추앙을 받으며 실리콘밸리 테크 기업들의 표준으로 자리 잡았다.
그러나 실상은 화려한 명성에 홀려 "우리도 트렌디하게 MSA 하자!"라며 무지성 도입했다가, 기가 막힌 네트워크 홉(Network Hops) 비용과 분산 데이터베이스 정합성 수렁에 빠져 회사가 공중분해되는 지름길이기도 하다.(...)
2. Monolithic vs. MSA (독재 정권 vs. 부족 동맹)
2.1. 단일형 아키텍처 (Monolithic Architecture)
모든 코드와 비즈니스 로직이 하나의 거대한 프로세스 안에서 돌아간다. 빌드와 배포가 단순하고, 내부 함수 호출만으로 모든 비즈니스를 수행하므로 속도가 매우 빠르다. 그러나 코드 한 줄만 잘못 짜서 메모리 누수가 발생하면 서비스 전체가 사멸하는 운명 공동체다.1
2.2. 마이크로서비스 아키텍처 (Microservices Architecture)
애플리케이션을 회원, 결제, 배송 등 비즈니스 경계(Bounded Context)에 따라 잘게 쪼갠다. 결제 서비스가 다운되어도 배송 서비스는 멀쩡히 돌아가므로 시스템 전체가 무너지는 대참사를 방지한다. 각 서비스마다 서로 다른 언어와 데이터베이스를 쓸 수 있는 분산 거버넌스(Decentralized Governance)가 가능해진다.
단점은 명확하다. 예전에는 메모리 단에서 0.001ms 만에 끝나던 함수 호출이 이제는 비싼 네트워크 홉(Network Hops)을 거치게 되며, 네트워크가 끊기거나 응답이 지연되면 시스템 전체에 렉이 걸린다.
3. 분산 시스템의 지옥, 트랜잭션과 거버넌스
3.1. 분산 데이터베이스와 데이터 일관성
MSA에서는 서비스마다 각자의 데이터베이스를 갖는 "Database per Service" 원칙을 지향한다. 이 때문에 기존 RDBMS에서 누리던 공짜 트랜잭션(ACID 보장)이 불가능해진다. 회원 서비스의 DB는 수정되었는데 결제 서비스 DB는 튕겼을 때, 이를 원복하기 위해 복잡한 분산 트랜잭션 패턴(Saga Pattern, 2-Phase Commit)을 직접 구현해야 한다.2
3.2. 분산 거버넌스와 독립적 배포
MSA는 중앙 통제를 배제하고 개별 팀이 자신들에게 알맞은 프레임워크나 데이터베이스를 자유롭게 고르게 만든다. 그러나 이는 관리할 대상이 곱절로 늘어남을 뜻한다. 도커와 쿠버네티스를 동원해 컨테이너를 관리해야 하고, 서비스들이 서로를 발견하기 위해 Service Discovery 서버를 두어야 하는 등 인프라 비용이 기하급수적으로 폭발한다.
4. 마이크로서비스와 관련된 애환의 밈
4.1. 무지성 MSA의 말로: 분산 모놀리스(Distributed Monolith)
비즈니스 경계를 엉터리로 설계하고 코드만 대충 쪼개어 배포했을 때 일어나는 참극이다. 코드는 흩어졌는데 여전히 강하게 결합해 있어 서비스 A를 배포하려면 B, C, D를 같이 배포해야 하고, 하나의 장애가 모든 네트워크 홉을 타고 전파되는 최악의 상태를 뜻한다. 실무자들은 이를 두고 "모놀리스의 단점과 분산 아키텍처의 고통을 모두 흡수한 혼종"이라 부르며 눈물을 흘린다.(...)
4.2. 마이크로서비스 데스 스타(Death Star)
서비스 개수가 수백 개로 불어나면서 서비스 간의 호출 흐름이 복잡한 스파게티처럼 얽힌 다이어그램을 칭하는 말이다. 넷플릭스나 아마존 같은 대기업의 마이크로서비스 호출 맵이 마치 우주선 데스 스타처럼 기괴하게 둥근 구형으로 밀집되어 있어 붙여진 이름인데, 이를 본 주니어 개발자들은 아름답다며 감탄하지만 시니어 백엔드 아키텍트들은 "저 중 하나 끊어지면 오늘 밤 퇴근은 글렀다"며 식은땀을 흘린다.3
5. 여담
- 넷플릭스(Netflix)의 오픈소스화: 넷플릭스는 전 세계에서 MSA를 가장 잘 운영하는 기업 중 하나로, 자신들이 삽질하며 만든 MSA 도구 세트(Netflix OSS - Eureka, Hystrix, Zuul)를 과감히 오픈소스로 풀었다. 전 세계 자바 진영이 이를 열렬히 환영하며 스프링 클라우드로 흡수해 사용했다.
- 모놀리스의 귀환: 최근 많은 스타트업과 대기업(심지어 Amazon Prime Video 등)에서 엄청난 MSA 유지 비용에 치여 다시 심플하고 견고한 모놀리식(Monolithic) 아키텍처로 회귀하는 트렌드가 돌고 있다. 역시 은총알(Silver Bullet)은 없다.
- 모놀리식 선배의 선경지명: 마틴 파울러는 "당신이 모놀리식으로 시스템을 제대로 설계할 능력이 없다면, MSA로 설계할 때는 백 배는 더 엉망진창으로 만들 것"이라며, 서비스 초기에는 제발 모놀리식으로 시작하라고 머리끄덩이를 붙잡고 말린 바 있다.