[DDD&MSA] 마이크로서비스(Microservice) 등장배경, 리액티브 선언
Book/DDD & MSA

[DDD&MSA] 마이크로서비스(Microservice) 등장배경, 리액티브 선언

리액티브 선언: 현대 애플리케이션이 갖춰야할 바람직한 속성들

2014년 요나스 보네르(Jonas Bonér) 등이 선언한 리액티브 선언문(The Reactive Manifesto)이다.

리액티브 시스템이란 다양한 상황에 따라 빠르고 적절하게 반응하는 시스템을 의미한다.

 

리액티브 선언문에서는 다음 4가지 특성을 강조하고, 이러한 요건을 만족하는 시스템을 리액티브 시스템이라고 정의한다.

  • 응답성(Responsive): 사용자에게 신뢰성 있는 응답을 빠르고 적절하게 제공하는 것을 의미한다.
  • 탄력성(Resilient): 장애가 발생하거나 부분적으로 고장 나더라도 시스템 전체가 고장 나지 않고 빠르게 복구하는 능력을 의미한다.
  • 유연성(Elastic): 시스템의 사용량에 변화가 있더라도 균일한 응답성을 제공하는 것을 의미하며, 시스템 사용량에 비례해서 자원을 늘리거나 줄이는 능력을 의미한다.
  • 메시지 기반(Message Driven): 비동기 메시지 전달을 통해 위치 투명성, 느슨한 결합, 논블로킹 통신을 지향하는 것을 의미한다.

 

위 4가지 요소는 모두 리액티브 시스템을 만들기 위한 요소이고, 각 요소는 상호 보완적이다.

 

리액티브 시스템이 신뢰성있는 응답을 빠르게 제공하고 부분적 장애가 빨리 복구되고 수요 증가에 탄력적으로 대응하기 위해서는 시스템 자체가 변화와 확장에 언제든지 대응할 수 있는 아키텍처 유연성(Flexibility)를 갖추는 것이 필수이다.

 

아키텍처 유연성은 시스템을 구성하는 구성요소 간의 관계들이 느슨하게 맺어져 있어 언제든지 대체되거나 추가 확장될 수 있는 특성을 말한다.

 

위 4가지 요소중 메시지 기반이라는 요소가 이러한 아키텍처 유연성을 만족시키는 요소라고 할 수 있다.


강 결합에서 느슨한 결합의 아키텍처로의 변화

예전에는 아키텍처의 구성요소들은 각 기업이나 특정 벤더의 제품에 전적으로 의존해서 구축하거나, 수정이 필요한 부분만 별도로 직접 개발하는 경우가 많았다.

따라서 특정 벤더 솔루션이나 프레임워크가 변경될 경우, 그것에 의존하는 애플리케이션의 많은 부분들을 변경해야 할 정도로 강 결합돼 있었다.

특정 벤더 중심의 아키텍처는 검증된 유명 제품군을 사용한다는 점에서 품질이 보장되기도 하지만, 특정 벤더에 의존한다는 점에서 특정 기술에 락인(lock-in)되어 쉽게 변경하거나 확장하지 못한다.

 

최근에는 클라우드 환경하에서 사용되는 오픈소스 또는 오픈소스를 기반으로 한 상용제품들이 품질이 높아지고 다양한 기능을 지원하면서 서로 다른 오픈소스 제품 간에도 충분한 호환성을 제공하기 때문에 하나의 벤더에 의존하거나 직접 구축할 필요가 적어졌다.

이러한 흐름은 아키텍처 설계에서 검증된 기술이나 솔루션보다 아래 그림처럼 필요한 영역에 적절한 솔루션을 선택하고 조합하는 개방적인 방식으로 변화하는데 영향을 주었다.


마이크로서비스의 외부 아키텍처와 내부 아키텍처

아래 그림은 마이크로서비스 아키텍처의 예다.

각 구성요소들은 대체하거나 변경할 수 있도록 구성된다.

맨 아래에 기반이 되는 하드웨어 인프라가 있고, 인프라 영역 위에 애플리케이션을 운영 및 구동하기 위한 플랫폼이 올라가며, 플랫폼 위에 애플리케이션인 서비스가 구동된다.


MSA 외부 아키텍처(Outer Architecture)

  • 외부 아키텍처는 마이크로서비스가 운영되는 환경을 정의한다.
  • 여기에는 인프라 환경, 플랫폼 환경, 마이크로서비스가 운영되는 애플리케이션 환경이 모두 포함되며, 애플리케이션 측면에서는 여러 개의 마이크로서비스를 관리하고 운영하기 위한 애플리케이션도 모두 포함된다. 

MSA 내부 아키텍처(Inner Architecture)

  • 내부 아키텍처는 실제로 비즈니스가 실행되는 비즈니스 애플리케이션, 즉 마이크로서비스의 내부구조를 정의한다.
  • 내부 아키텍처는 마이크로서비스가 제공하는 API, 비즈니스 로직, 이벤트 발행, 데이터 저장 처리 등을 어떻게 구조화해야 하는가에 관한 내용이다.