모놀리식은 하나의 애플리케이션에 모든 비즈니스 요소를 구현해 전체적인 서비스를 구현하는 방식이라면 MSA는 분리될 수 있는 비즈니스 요소는 마이크로서비스 단위로 DB까지 분리한 후 이들이 모여 전체적인 서비스를 구현하는 방식이다.
모놀리식은 모든 서비스가 하나의 애플리케이션에 구성되며 도메인간 강한 결합도를 가진다. 마이크로서비스 아키텍처는 도메인에 따라 물리적으로 분리되며 각각의 마이크로서비스간 약한 결합도를 가진다.
코드레벨에서 도메인간 강결합에 의해 유지보수에 많은 어려움을 느끼게 되었고, 시스템이 복잡해질수록 모놀리식에 비해 훨씬 유연하게 대처 가능한 마이크로서비스 아키텍처가 각광받게 되었다.
모놀리식의 경우 모든 서비스가 하나의 애플리케이션에 구성되기 때문에 개발 유연성 부분에서 한계점을 지닌다.
만약 시작을 자바로 했으면 모든 서비스를 자바로 구성해야한다. 특정 기능 구현에 강점인 경우(ex - 소켓통신, 머신러닝) 해당 언어를 사용하기가 힘들다.
모놀리식 시스템의 경우 모든 서비스가 하나에 구현되어 아주 강한 결합도를 가지기에 기능 구현이 되어있는 의존성끼리도 강한 결합도를 가진다.
그로 인해 의존성을 교체할 때 기존 기능에 미칠 영향도를 파악하기 어려워 옛날 버전의 의존성을 그대로 활용해야하는 문제점이 있고 의존성 버전을 바꾸기가 쉽지 않아 의도대로 기능 구현이 힘들 수 있다.
모든 서비스가 하나의 애플리케이션에 구성되어 있다. 하나의 기능이 추가되거나 버그 수정 등이 이루어질 경우 모놀리식 시스템이기에 전체적인 기능에 대한 테스트와 빌드, 그리고 배포가 이루어져야 한다. 얼마나 부담스러운가, 간단한 수정조차도 전체적인 테스트와 빌드, 배포가 이루어져야 한다.
마이크로서비스 아키텍처는 마이크로서비스 단위로 테스트, 배포가 이루어지므로 모놀리식에 비해 훨씬 부담이 덜하다.
모놀리식은 하나의 거대한 시스템이고 강한 결합도를 가지기 때문에 특정 서비스에서 장애가 발생하면 그 장애는 다른 서비스로 전파된다. 상품 구매 기능에 장애가 발생하면 상품 조회도 안되는 것이다.
MSA는 모든 서비스가 약한 결합도를 가져 특정 마이크로서비스에서 장애가 발생할 경우 장애나는 서비스를 격리시켜 다른 마이크로서비스에는 영향을 덜 주고 빠른 복구가 가능하다.
모놀리식 시스템의 경우 모든 요소가 하나의 모놀리식 시스템에 구현되어 있으므로 모놀리식 단위로 스케일링이 이루어져야 한다. 즉 스케일 아웃이 힘들다.
모놀리식 시스템을 구성하는 여러 요소(상품구매, 상품조회 등) 중 특정 요소만이 엄청 인기가 많으면 어떨까, 해당 요소만 어떻게 리소스를 배분할 수 없다. 스케일링을 하고자 하더라도 전체 모놀리식 시스템 단위로 스케일링이 이루어져야 한다.
MSA는 각 요소가 분리되어있어 인기있는 마이크로서비스만 스케일링을 더 하고 리소스를 더 부여하는 등 리소스를 효율적으로 사용할 수 있다.
마이크로서비스 아키텍쳐가 무엇이고 그 장점에 대해 알아보았고 많은 기업에서 MSA를 도입, 전환하고 있음을 알게됐다. 그렇다고 모든 프로젝트에서 MSA가 정답일까, 그것은 아니다!
Don't even consider microservies unless you have a system that's too complex to manage as a monolith. - MARTIN FOWLER
마틴 파울러는 모놀리식 아키텍처의 단점이 들어날 정도로 시스템이 복잡하지 않다면 MSA를 고려하지 말라고 하고 있다.
시스템의 복잡성이 높아야 MSA가 모놀리식에 비해 생산성이 높아지며 무조건 MSA가 정답이 아니다.
모놀로식에 비해서 마이크로서비스 아키텍처의 단점도 있다. 주로 모놀로식의 장점이었던 점이 MSA의 단점이라고 보면 된다.
모놀리식은 단일 트랜잭션으로 처리하면 되지만 MSA는 데이터베이스가 분리되어 있기 때문에 각각의 데이터베이스에서의 트랜잭션을 처리해주어야 한다. 또한 데이터들이 도메인 별로 분리되어 있어 데이터 정합성 관리도 어려워진다.
마이크로서비스가 많아지면 많아질수록 로그 추적에서 어려움을 느끼고 마이크로서비스 간 통신이 이루어지기 때문에 이를 추적하는 것에도 점점 어려워진다.
마이크로서비스 간 통신이 이루어지기 때문에 관련 네트워크 비용 및 지연 시간이 증가한다.
마이크로서비스 아키텍처가 무엇이고 그 장단점에 대해 알아보았다.
그럼 마이크로서비스는 무엇을 기준으로 분리할까?
마이크로서비스를 식별하는 가장 쉬운 방법은 경험적인 원칙을 적용하는 것이다.
크리스 리처드슨은 비즈니스 능력에 따라 서비스를 식별할 수 있다고 말한다.
각 도메인에서는 조직, 부서 체계가 이미 정의되어 있다. 이러한 부서는 업무 처리에서의 응집성을 가지고 있고 타 부서와의 의존도는 낮을 것이다. (주문, 배송, 상품, 결제 부서)
이처럼 비즈니스 부서가 가진 역할, 처리 능력을 체계적으로 분해하는 업무 기능 분해를 통해 마이크로서비스를 도출해낼 수 있다.
마이크로서비스를 도출할 때 서비스가 소유권을 가진 데이터를 독립적으로 식별하는 것이 중요하나 비즈니스 능력에 근거한 도출방법은 서비스가 소유해야할 데이터 식별에 적합하지 않다.
DDD의 전략적 설계를 통해 바운디드 컨텍스트를 기반으로 마이크로서비스를 도출해낼 수 있다.
도메인은 여러 서브 도메인으로 구성될 수 있다. 이러한 하위 도메인들은 별도의 도메인 모델로 정의되며 각 도메인 모델은 해당 도메인에서만 용어가 통용되는 유비쿼터스 언어가 정의된다.
바운디드 컨텍스트란 이러한 도메인들 간의 경계를 의미한다. 자세한 내용은 다음 시간에 알아보장
DDD(도메인 주도 설계) 는 MSA 라는 개념이 등장하기 이전부터 존재하던 디자인 패턴으로 각광받지 못하다가 마이크로서비스를 도출하는 과정에서 DDD의 개념이 많은 도움이 된다는 것이 발견되고 최근 각광받고 있다고 한다. DDD에 대해서는 차근차근 알아보고자 한다. (넘모 어려운 개념..)
마이크로서비스의 특징 중 하나는 마이크로서비스 별로 해당 서비스에 적합한 데이터베이스를 사용한다는 것이다. 이를 지칭하는 용어가 Polyglot Persistence
이다.
Polyglot Persistence
란 다양한 데이터 저장 요구 사항에 대해 여러 데이터 저장 기술을 사용하는 것을 나타내는 용어이다.
서비스 별로 적합한 데이터베이스를 선택하여 NoSQL을 사용할 수도, SQL을 사용할 수도 있다.
각 마이크로서비스는 각자의 DB를 가지고 있고 다른 서비스의 DB 에 접근할 수 없다. 제공된 API 를 통해서만 접근이 가능하여 데이터를 캡슐화하고 결합도를 낮출 수 있다.
서비스간 DB를 분리하는 폴리그랏(polyglot)의 형태로 가지 않으면 이는 분산 모놀리스(distributed monolith)에 가깝다. 분산 모놀리스는 결합도가 매우 높은 아키텍처를 만들어내며 모놀리식의 단점에 마이크로서비스 아키텍처의 단점만 가져가는 꼴이 된다.
마이크로서비스 아키텍처에 대해서 알아보았다. MSA하면 무엇이 떠오르는가, 쿠버네티스가 떠오른다. MSA에서 컨테이너 기술은 거의 필수적이라고 할 수 있지만 꼭 쿠버네티스를 써야만 MSA라고 할 수는 없다.
ECS, docker swarm 등 다양한 MSA를 배포, 관리하는 방법이 존재한다.
그럼에도 왜 쿠버네티스인가, 쿠버네티스는 GOD 구글에서 만든 컨테이너 오케스트레이션 도구로 인프라 환경을 추상화해 인프라 관리를 매우 쉽게 해준다.
수많은 마이크로서비스들을 운영하고 배포하고 모니터링 해주며 관리해야하는데 쿠버네티스는 이를 상대적으로 쉽게 해준다.
또한 많은 기업에서의 활용사례를 찾아볼 수 있으며 많은 MSA를 배포할 때 쿠버네티스를 사용한 성공 사례들이 존재해 MSA 서비스를 배포할 때 쿠버네티스가 각광받게 되었다.
오늘은 마이크로서비스 아키텍처에 대해서 알아보았다.
MSA는 모놀리식에 비해 설계하고 개발하는데 많은 시간과 비용이 소요된다. MSA의 어려움은 구현이 아니다, 바로 분석, 설계이다.
다음 시간에는 MSA를 분석 설계하는 과정에서 마이크로서비스를 도출해내는데 많이 사용되는 DDD(도메인 주도 개발)에 대해 알아보고자 한다.
네이버 클라우드 플랫폼 유튜브 - 누구나 쉽게 이해하는 MSA 시리즈
도메인 주도 설계로 시작하는 마이크로서비스 개발
https://engineering-skcc.github.io/microservice%20modeling/microservice-%EB%8F%84%EC%B6%9C%EA%B8%B0%EB%B2%95/