한덩어리로 구성된 모노리스 시스템에서 여러 조각으로 구성되는 마이크로서비스 시스템으로 변화함에 따라 발생하는 문제점들을 해결하기 위해 등장했던 MSA패턴들을 살펴보고자 합니다.
인프라 패턴
: 마이크로서비스를 지탱하는 하부구조 인프라를 구축하는데 필요한 구성요소플랫폼 패턴
: 인프라 위에서 마이크로서비스의 운영과 관리를 지원하는 플랫폼 차원의 패턴애플리케이션 패턴
: 마이크로서비스 애플리케이션을 구성하는데 필요한 패턴IT환경을 운영하고 관리하는데 필요한 근간이 되는 하드웨어, 소프트웨어, 네트워크, 운영체제, 데이터스토리지 등을 모두 포괄한다.
마이크로서비스는 어떠한 환경에서도 유연하도록 구성돼야 하므로 특정인프라를 고집하지 않는다 그렇지만 인프라의 유연한 확장/축소를 위해 가상화 환경이 필요하다.
Guest OS를 사용하는 가상머신의 경우 운영체제 관련 오버헤드가 지속적으로 발생한다. 이때문에 마이크로서비스 같이 작은 서비스를 패키지하고 배포하기에는 컨테이너 환경이 더 적합하다.
인프라 환경 위에서 애플리케이션을 운영하고 관리하는 구성방법
프론트엔드 클라이언트가 여러개의 백엔드 마이크로서비스를 어떻게 호출해야할까? 또한 스케일 아웃을 통해 인스턴스가 여러개로 복제되었다면 어떻게 부하를 적절히 분산 시킬수 있을까?
이를 위해서는 라우팅기능과 로드밸런싱 기능이 제공되어야한다. 라우팅기능은 최적의 경로탐색을 위해서 백엔드 서비스와 매핑되는 유동ip 정보를 저장하는 서비스 레지스트리를 사용한다.
여러 클라이언트가 여러 마이크로서비스를 호출하게되면 복잡한 호출관계가 만들어진다. 이를 위해 API게이트웨이라는 단일 접점을 만들어 효율적으로 서비스를 처리한다(라우팅, 로드밸런싱, 인증/인가, 장애격리)
API게이트웨이처럼 단일접점을 두는 것이 아니라 클라이언트 환경에 따라 다양한 진입점을 두는 패턴이다. 이로써 클라이언트의 종류에 따라 최적화된 처리를 수행할수 있게 한다.
각 마이크로서비스 애플리케이션이 특정한 배포 환경에 종속되지 않게 설정정보를 외부 구성 저장소에 공동으로 저장해 변경에서 분리하는 패턴이다.
여러 서비스 중 하나의 서비스에서 장애가 발생했을 때 장애를 전파시키지 않게 하기위해 서비스 호출에 임계치를 지정해 초과하게되면 모두 실패처리를 하게 만드는 패턴이다.
UI를 기능별 프레임 별로 분리하여 이를 조합하여 하나의 서비스로 구성하는 패턴
마이크로서비스별로 기능을 분리하고 각각의 저장소를 격리하여 비즈니스를 처리한다. 이때 데이터의 정합성, 일관성이 보장되어야한다.
시스템에서 상태를 변경하는 명령과 상태를 조회하는 명령을 분리하여 상대적으로 많이 처리되는 상태를 조회하는 명령에 대한 읽기모델을 따로 확장함으로써 시스템 부하를 줄이고 효율적으로 리소스를 사용한다.
비즈니스 불일치를 피하기 위해 데이터 저장과 메시지를 보내는 작업이 원자성을 지녀야 한다. 매번 이 두 작업을 수행하기에는 비효율적이다.
따라서 이벤트 소싱 패턴에서는 이벤트를 처리해서 데이터 모델로 변경하는 작업 없이 이벤트 스트림에 트랜잭션 자체를 저장하는 방법을 사용한다.
현재 데이터 상태를 처리할때는 이전에 저장된 스냅샷 이후 트랜젝션을 수행하여 처리한다.