Self-contained Service

마이크로서비스 아키텍처(MSA)에서 “self-contained service” 패턴은 서비스의 자율성과 독립성을 극대화하는 중요한 개념이다.

Self-contained Service는 단일 비즈니스 기능을 완전히 독립적으로 구현한 서비스를 의미한다.
이 서비스는 자체적으로 데이터를 저장하고, 비즈니스 로직을 처리하며, 사용자 인터페이스를 제공할 수 있다.

Self-contained Service 패턴은 MSA의 핵심 원칙을 구현하는 방법 중 하나로, 서비스의 자율성과 독립성을 극대화하여 시스템의 유연성과 확장성을 높이는 데 기여한다. 하지만 이 패턴을 적용할 때는 시스템의 복잡성 증가와 데이터 일관성 관리 등의 도전 과제를 고려해야 한다.

주요 특징

  1. 독립성: 다른 서비스에 의존하지 않고 독립적으로 작동한다.
  2. 자체 데이터 관리: 서비스는 자체 데이터베이스를 가지며, 다른 서비스가 직접 접근할 수 없다.
  3. 단일 책임: 하나의 비즈니스 기능 또는 도메인에 집중한다.
  4. 독립적 배포: 다른 서비스에 영향을 주지 않고 독립적으로 배포할 수 있다.
  5. 기술 다양성: 서비스마다 가장 적합한 기술 스택을 선택할 수 있다.

구현 방법

  1. 비동기 통신: SAGA 패턴을 사용하여 데이터 일관성을 비동기적으로 유지한다.
  2. CQRS 패턴 활용: 다른 서비스가 소유한 데이터의 복제본을 유지하여 독립성을 높인다.
  3. API 제공: 필요한 경우 REST 엔드포인트를 통해 기능을 외부에 노출한다.
  4. UI 포함: 서비스는 자체 UI를 포함할 수 있으며, 다른 서비스와 UI를 공유하지 않는다.

예시

예를 들어, 온라인 음식 배달 애플리케이션에서 주문 서비스를 고려해보자.
주문 서비스는 레스토랑 메뉴 정보, 소비자 정보, 주방 티켓 생성, 결제 승인 등 여러 기능을 수행해야 한다.
이러한 기능을 수행하기 위해 다른 서비스와 동기적으로 통신하면, 해당 서비스의 가용성에 따라 주문 서비스의 가용성이 영향을 받을 수 있다.

이를 해결하기 위해 주문 서비스는 필요한 데이터를 자체적으로 보유하고, 주문 생성 시 다른 서비스와의 통신을 비동기적으로 처리하도록 설계할 수 있다.
예를 들어, 레스토랑 메뉴 정보를 CQRS 패턴을 사용하여 복제하고, 주문 생성 후 사가 패턴을 통해 다른 서비스와의 상호작용을 비동기적으로 처리함으로써, 주문 서비스의 독립성과 가용성을 높일 수 있다.

장점

  1. 높은 가용성: 한 서비스의 장애가 전체 시스템에 영향을 미치지 않는다.
  2. 독립적 확장: 필요에 따라 개별 서비스를 독립적으로 확장할 수 있다.
  3. 빠른 개발 및 배포: 작은 팀이 독립적으로 개발하고 배포할 수 있어 시장 변화에 빠르게 대응할 수 있다.
  4. 기술 다양성: 각 서비스에 가장 적합한 기술을 선택할 수 있다.

단점

  1. 복잡성 증가: 분산 시스템 관리의 복잡성이 증가할 수 있다.
  2. 데이터 중복: 서비스 간 데이터 복제로 인한 중복이 발생할 수 있다.
  3. 일관성 관리: 분산된 데이터의 일관성 유지가 어려울 수 있다.

참고 및 출처