MSA 구현 패턴
1. API First Design
타 서비스나 화면에서 필요한 기능을 제공하는 인터페이스로 API를 식별
물리적으로 서비스가 분리되지만, runtime coupling이 발생하여 강결합 상태가 됨
--> API Gateway, Service Meshg, LB, Service Registry, Circuit breaker 등을 활용한 추가 구성 필요
(1) 동기 호출 구성 : 직관적이며 이해하기 쉬움. callee가 항상 가용해야 함. 2PC가 가능함
(2) 비동기 구성 : 응답이 필요없거나 트랜잭션 분리가 가능하거나 호출대상 API 처리 시간이 길 경우 사용
--> callback 함수, 서비스 간 공유 cache/DB 를 활용하여 처리 결과 폴링
https://mangdan.github.io/api-first-design-and-development-1
Synchronous / Asynchronous
Notification vs Request/Async Response
Publish/Sucscribe
분산 트랜잭션
NoSQL, MSA에 기반한 App 별 분리된 DB 사용, 서비스 간 데이터 일관성 필요
ACID 에 대응하는 BASE
Atomicity (원자성)
Consistency (일관성)
Isolation (독립성)
Durability (지속성)
BA (Basically Available)
S (Soft-State)
E (Eventually Consistency)
Compensating Transaction (보상 트랜잭션)
서비스 간 트랜잭션 처리 과정에서 실패/에러가 발생하는 경우, 명시적(프로그래밍)으로 실패에 대한 처리를 해야 한다.
SAGAS
1987년도 Hector Garcia-Molina 가 작성한 논문에서 제안된 용어이다.
Orchestration
중앙(한곳)에서 비즈니스와 트랜잭션을 제어하는 방법.
Command 기반으로 동작한다.
Choreography
상호간 서비스 실행 결과에 따라 정상/비정상 처리 결과에 따른 로직을 수행한다.
Event 기반으로 동작하며, 서비스들 간 발행/구독된 이벤트에 따라 로직이 실행됨.
분산 데이터 조회
API Composition
각 서비스들의 API를 호출하고, 그 결과를 조합하여 하나의 Response를 만들어 제공
CQRS (Command Query Responsibility Segregation)
Command와 Query를 분리하는 패턴 (저장과 조회를 분리)
데이터 복제 방식
CDC (Changed Data Capture)
Batch/ETL
Message Queue
MSA를 구성하는 기술들
API Gateway
https://aws.amazon.com/ko/api-gateway/
Service Mesh
https://www.redhat.com/ko/topics/microservices/what-is-a-service-mesh
Backing Service
MSA School
MSA 핵심패턴만 빠르게 이해하기
비동기 메시지 기반 주문 처리
https://happycloud-lee.tistory.com/188
이벤트 스토밍
도메인 주도 설계
1. 전략적 설계
1.1. 바운디드 컨텍스트
1.2. 유비쿼터스 언어 (보편언어)
1.3. 컨텍스트 매핑
- 공유커널 (shared kernel): 바운디드컨텍스트 사이에 공통 모델 공유하는 관계
- 고객공급자 유형(customer-supplier): 고객이 원하는 것을 공급자가 제공해주는 관계
- 준수자 유형(confirmist): 공급자의 모델을 그대로 따르는 방식의 관계
- 충돌방지계층(anti-corruption layer): 공급자 모델과 고객 모델 사이에 번역 계층을 만드는 방법
- 공개 호스트 서비스(open host service): 바운디드 컨텍스트에 접근할 수 있는 인터페이스를 정의하는 방법
- 발행된 언어(publiched language): 바운디드 컨텍스트의 규모와 상관없이 사용과 번역을 가능하게 하는 문서화된 정보교환언어를 제공하는 방법
2. 전술적 설계
2.1. 애그리거트
2.2. 엔티티, 값객체
2.3. 도메인 서비스
2.4. 애플리케이션 서비스
MSA
MSA 전환 접근 전략
- 빅뱅 방식
- 미트 인 미들
- 현행 시스템 중심 비즈니스 요구에 의한 점진적 전환
MSA 서비스 도출 과정
1. 후보 서비스를 도출
- 대상 업무를 기능 레벨로 분해하여 후보 서비스를 도출한다.
- 조직 구성 (운영팀 등)에 따라 기능을 분해한다.
- 공통 기능(업무)를 한곳에 모은다.
- 분해된 기능 목록을 특정 레벨 기준으로 후보 서비스를 도출한다.
- bounded context 와 shared kernel 로 구분
2. 도출된 서비스 평가
- 도출된 서비스를 평가한다.
- 서비스의 현재 업무 연관도와 database (분산) 를 분석한다.
- 업무 요건에 따라 평가 지표 항목을 정의한다.
- 독립 배포 (서비스 간 연관도, 데이터 상관 관계 등)
- 트랜잭션 증가 (데이터 용량, 증가 등)
- 빠른 배포/반영 여부
- 요구사항 변경 빈도 (업무변경)
- 조직 구성 형태 (운영 조직)
- business agility
3. 평가 결과에 따른 서비스 정의
- bounded context 정의
- shared kernel 정의
- 서비스별 분산 데이터베이스 정의
- 분산 또는 scale out 대상 정의
- 서비스 별 아키텍처 정의
4. 설계
- tobe 시스템 설계 : cqrs, circuit breaker, saga, 비동기 등
- 데이터 설계 : 파티셔닝, 조인 등
- shar kernel 설계시
- DB 복제
- Cache 활용
- 배치, 리포트
- 신속하고 빠른 배포를 위해 분리
- 사용량 증가/폭증에 대비한 유연한 확장 구조를 위한 분리
- 장애 격리를 위해 분리
- 서비스 독립성을 고려하여 비동기 호출 설계 (noti, async response, pub/sub)
- callee 서비스의 응답이 필요없거나, 처리시간이 오래 걸릴 경우 : ntification
- 1:N 형태로 event 전달이 필요한 경우 : pub/sub
- 조회 업무가 대부분인 경우 CQRS로 분리 (데이터 정합성을 위해 DB 복제 사용. 데이터 복제는 event/message queue 활용, 통계/조회 업무 등) -> 필요한 데이터가 서비스 내에 존재하므로 API Composition과 달리 독립된 서비스 제공 가능
- 다수의 팀이 협업/설계하는 경우 shared kernel로 식별하여 통합 (공통 업무 등)
- 신기술 적용 및 검증을 용이하게 하기 위한 분리
- 실시간 데이터 정합성이 중요할 경우 서비스 통합 (2PC 가 중요하거나 기존 테이블 조인 분리가 어려울 경우)
- 서비스 간 프로세스 및 데이터 공유가 빈번할 경우 서비스 통합
5. 개선
Service Mesh
istio
CQRS
shared kernel 설계시,
- 변경이 거의 없는 코드값 같은 데이터 : cache
- 일정 시간 내에만 동기화 되면 되는 경우 : message queue
- 변경시 즉시 조회 (정합성 높은 경우) : API 연계 나 Shared DB
휴리스틱 예외 ***********************
Eventual Consistency (결과적 일관성, 최종 일관성)
결과적 일관성을 위한 주문/재고/결제 MSA 구성방법 예시
SAGA 패턴
비동기메시징 이슈 및 해결방안
쿠버네티스
MSA로 구성시 단점
다수의 micro App 으로 구성되므로, 구성요소 간 네트워크 트래픽이 비약적으로 증가됨 (모놀리틱과 비교하여)
- 네트워크 지연 발생
- 네트워크 트래픽 증가 (서비스 패킷 + 복제 + 하트비트 등 관리용 등등)
- 네트워크에 대한 신뢰성 문제 (네트워크 장애시, 또는 공격/해킹 등)
Service Mesh
네트워크 관련 비용 증가로 인해 통신 및 네트워크 기능을 어플리케이션 로직과 분리하여 제공하기 위한 인프라
- service discovery
- load bvalancing
- dynamic request routing
- circuit braking
- failure recovery
- health check
- metrics and telemetry
- authentication and security
PaaS 형태의 제공, Library를 활용한 API 활용, Sidecar proxy 형태 (istio/envoy )
Message Broker를 통해 데이터를 전달하게 되면, 2 Phase commit 이 불가능하게 된다.
또한 NoSQL DB 를 사용하거나 서비스별 DB가 분리되어 있다면 2PC가 불가능하게 되어 데이터 정합성을 유지하기 위한 방법이 필요하다. --> SAGA , 재처리, 보상트랜잭션, Batch 기반 실패건 처리 등 필요
- Orchestration 방식으로 중앙에서 보상처리 -> 구현이 쉬움
- Choreography 방식으로 서비스들 간 message/event 를 pub/sub 해서 처리함
기존 모놀리틱 App를 MSA구조로 변경시 DB 분리가 될 수 있는데, 이 때 join 이 필요할 경우는 API Composition을 활용하거나, DB복제를 통해 CQRS 패턴 적용
좀 더 읽어보기
https://www.nirs.go.kr/newsletter/2015-12/issue.html
'IT > Study' 카테고리의 다른 글
MSA가 어렵다고 하는 이유는 무엇일까 (0) | 2022.03.07 |
---|---|
IoT / oneM2M - 용어 정리 (0) | 2021.03.25 |