[microservice] 아키텍처
Updated:
개요
- 어플리케이션을 느슨하게 결합된 서비스의 모임으로 구조화하는 서비스 지향 아키텍처(SOA) 스타일의 일종인 소프트웨어 개발 기법
Monolithic Architecture VS MicroService Architecture
- Monolithic Architecture
- 하나의 서비스 또는 어플리케이션이 하나의 거대한 아키텍처를 지니는 설계 방식
- MicroService Architecture
- 하나의 큰 어플리케이션을 여러 개의 작은 어플리케이션으로 나뉘는 설계 방식
장점
- 확장성
- 서비스 간의 의존성과 연관성이 최소화
- 배포
- 서비스 별 개별 배포 가능
- 배포 시 다른 서비스에 영향 없음
- 장애 전이성
- 특정 서비스에 장애가 발생되어도 다른 서비스는 정상 동작
- 신규 서비스 추가 및 유지보수
- 코드 분석 및 개발의 진입장벽 낮음
- 해당 서비스에만 집중 가능
- 기술 스택 선택의 자유로움
- 서비스간 프로토콜만 지킨다면 언어나 신기술 적용이 자유로움
단점
- 통신 비용 증가
- 서비스 간의 통신이 필요
- 모니터링 포인트 증가
- 서비스 개수 만큼의 모니터링 필요
- 트랜잭션
- 서비스와 데이터베이스가 분산되면서 단일 DBMS의 트랜잭션 기능으로 해결 불가능한 경우 발생
- 테스트가 상대적으로 복잡
패턴
- SAGA pattern
- 서비스들끼리 이벤트를 주고 받으면서 다음 트랙잭션 단계를 트리거
- 실패 시 이전 서비스들에게 보상 이벤트를 발행하여 롤백 시도
- Choreography based SAGA pattern
- 서비스 별로 트랜잭션 관리 로직이 있어 실패한 서비스가 보상 이벤트를 발행
- 서비스가 적은 시스템에 적합
- 이벤트 추적이 어려움
- 서로의 이벤트를 소비해야 하므로 순환 종속성 유의
- Orchestration based SAGA pattern
- 트랜잭션 처리를 위해 SAGA 인스턴스가 별도로 존재
- 서비스들은 SAGA 인스턴스에 의하여 트랜잭션을 수행하
- 실패 시 SAGA 인스턴스가 보상 이벤트를 발행
- 서비스가 많은 시스템에 적합
- 이벤트 추적이 쉬움
- 관리 포인트 증가
- CQRS(Command and Query Responsibility Segregation) pattern
- 커맨드와 쿼리를 구분
- 커맨드
- CRUD 중에 CUD
- 쿼리
- CRUD 중에 R
- 커맨드
- 대부분 데이터 변경과 데이터 조회로 구분이 되는데 하나의 도메인 모델로 처리하려고 하다보니 복잡도 증가를 해결하기 위해 등장
- 적용 방안
- 데이터베이스는 분리하지 않고 모델만 커맨드 모델과 쿼리 모델로 분리
- 쉽게 적용 가능
- 데이터베이스 관련 성능 향상은 불가
- 데이터베이스 분리
- 각각의 모델에 맞는 데이터베이스 선택
- 데이터베이스 간의 동기화 문제 존재
- 이벤트 소싱 적용
- 모든 이벤트를 저장
- 수정, 삭제가 없고 추가만 존재
- 데이터베이스는 분리하지 않고 모델만 커맨드 모델과 쿼리 모델로 분리
- 커맨드와 쿼리를 구분
- DDD(Domain Driven Design) pattern
- 도메인 주도 설계