Monolithic vs Microservices

시스템을 구축하는 방식은 크게 모놀리식 아키텍처와 마이크로서비스 아키텍처(Microservice Architecture, MSA)로 나눌 수 있다.

모놀리식 아키텍처(Monolithic Architecture)

모놀리식 아키텍처는 시스템의 모든 기능이 하나의 애플리케이션에 통합된 구조로, 모든 로직이 단일 프로세스 내에서 실행되며, 배포 단위도 하나다.

  • 초기 개발 속도가 빠름

  • 모든 코드가 한곳에 있어 로직 추적과 통합 테스트 용이

하지만 시스템 규모가 커지고 비즈니스가 복잡해지면 모놀리식 구조는 여러 한계에 부딪힌다.

  • 배포의 경직성: 작은 코드 수정으로 전체 시스템의 빌드, 테스트, 배포를 다시 유발

  • 비효율적인 확장성: 특정 기능(예: 검색)에만 트래픽이 몰려도 시스템 전체를 복제하여 확장(Scale-out) 필요

  • 기술 스택의 종속성: 한번 정해진 기술 스택 변경 및 새로운 기술을 도입의 어려움

  • 개발 병목: 여러 팀이 하나의 거대한 코드베이스를 동시에 수정으로 인한 충돌과 조정 비용 증가

마이크로서비스 아키텍처(Microservice Architecture, MSA)

마이크로서비스 아키텍처는 하나의 큰 애플리케이션을 여러 개의 작은 서비스로 분리하는 접근 방식이다.

핵심 원칙

  • 단일 책임 원칙: 각 서비스는 고유한 비즈니스 영역(도메인)에 대한 책임을 가짐

    • 도메인 주도 설계(DDD)의 바운디드 컨텍스트(Bounded Context) 개념과 유사

  • 독립적인 배포: 서비스는 서로 독립적으로 개발, 테스트, 배포 가능

  • 데이터베이스 분리: 각 서비스는 자신만의 데이터베이스를 소유하는 것을 지향(서비스 간 강한 결합 방지)

  • 기술 다양성: 각 서비스에 가장 적합한 프로그래밍 언어, 프레임워크, 데이터베이스를 자유롭게 선택 가능

장점

  • 선택적 확장성: 트래픽이 몰리는 특정 서비스(예: 결제)만 선택적으로 확장할 수 있어 자원 효율성 극대화

  • 빠른 배포 주기: 각 팀이 맡은 서비스를 독립적으로 빠르게 배포 가능

  • 장애 격리: 하나의 서비스에 장애가 발생하더라도, 해당 장애가 시스템 전체의 중단으로 이어지는 것을 방지 가능

  • 팀의 자율성: 작은 팀이 특정 서비스의 전체 라이프사이클을 책임지며, 의사결정 속도 향상

MSA가 마주하는 새로운 도전 과제

MSA가 모놀리식의 문제를 해결하지만, 분산 시스템 고유의 복잡성을 새롭게 만들어낸다.

  1. 분산 트랜잭션과 데이터 일관성

    • 서비스마다 데이터베이스가 분리되면, 여러 서비스에 걸친 데이터 변경을 하나의 트랜잭션으로 묶을 수 없음

    • SAGA 패턴을 사용해 최종 일관성(Eventual Consistency)을 맞추거나, 트랜잭셔널 아웃박스 패턴 등 활용

  2. 네트워크 통신과 장애 전파

    • REST API나 gRPC 같은 동기식 호출은 하나의 서비스 지연이나 장애가 호출한 서비스에 연쇄적으로 전파 가능

    • 장애가 발생한 서비스를 일시적으로 차단하는 서킷 브레이커 패턴 도입 필요

  3. 서비스 탐색 (Service Discovery)

    • 수많은 서비스가 동적으로 생성되고 지는 환경에서 각 서비스의 위치(IP, Port)를 관리하는 메커니즘 필요

    • Eureka, Consul 같은 서비스 디스커버리 도구 활용

  4. 운영 및 모니터링의 복잡성

    • 배포, 모니터링, 로깅, 설정 관리가 모두 분산되어 복잡도가 기하급수적으로 증가

    • 하나의 요청을 추적하기 위해 여러 서비스의 로그를 연결하는 분산 추적 시스템 필요

Last updated

Was this helpful?