본문 바로가기

Archived(IT)/MSA

마이크로 서비스 패턴 #2 마이크로 서비스 아키텍처

키워드 위주의 복습용 정리

소프트웨어 아키텍처 
컴퓨팅 시스템의 소프트웨어 아키텍처는 소프트웨어 엘리먼트와 그들 간의 관계, 그리고 이 둘의 속성으로 구성된 시스템을 추론하는 데 필요한 구조의 집합이다.

-Len Baas-

애플리케이션의 요건

  • 애플리케이션이 해야할 일을 정의기능 요건
  • 애플리케이션의 서비스 품질 요건

 

4+1 뷰 모델

 

계층화 아키텍처 스타일

표현 계층(Presentation) : 사용자 인터페이스 또는 외부 API 구현 계층

비즈니스 로직 계층 : 비즈니스 로직 구현 계층

영속화 계층(Persistence) : DB 상호 작용 로직이 구현된 계층

 

이에 따른 문제점

  • 표현 계층이 하나 뿐이다(애플리케이션 호출하는 시스템 다수 존재 가능)
  • 영속화 계층이 하나 뿐이다(상호작용하는 DB 다수 존재 가능)
  • 비즈니스 로직 계층을 영속화 계층에 의존하는 형태로 정의한다

이에 따라 육각형 아키텍처 스타일이 필요!

육각형 아키텍처 스타일

논리 뷰를 비즈니스 로직 중심으로 구성하는 계층화 아키텍처 스타일의 대안이다. 애플리케이션에 표현 계층 대신 비즈니스 로직을 호출하여 외부에서 들어온 요청을 처리하는 인바운드 어댑터와 영속화 계층 대신 비즈니스 로직에 의해 호출되고 외부 애플리케이션을 호출하는 아웃바운드 어댑터를 둔다. 

MSA도 결국 아키텍처 스타일이다

모놀리식 아키텍처

애플리케이션을 실행/배포 가능한 단일 컴포넌트로 구성한다

 

마이크로서비스 아키텍처

애플리케이션을 느슨하게 결합된, 독립적으로 배포 가능한 여러 서비스로 구성한다.

 

서비스 -> 어떤 기능이 구현되어 단독 배포가 가능한 소프트웨어 컴포넌트

느슨한 결합 -> 느슨하게 결합된 서비스 관계는 MSA의 핵심

공유 라이브러리 -> MSA에서는 변형 가능성이 존재하면 공유 라이브러리로 설계하지 않는다

서비스 규모? -> MSA에서 Micro가 가지는 의미와 별개로 서비스 규모 자체는 중요하지 않다

 

MSA 정의 3단계 프로세스

시스템 작업 식별

애플리케이션 아키텍처 정의의 출발은 시스템 작업을 정의하는 것

시스템 작업은 2단계 프로세스를 거쳐 애플리케이션 요건으로부터 도출

 

고수준 도메인 모델 생성 >  전제/조건/결과 작성

시스템 작업 정의 > 커맨드(CRUD), 쿼리(조회) 구분

 

서비스 정의

비즈니스 능력에 따라 정의(비즈니스 능력이 조직의 핵심역량)

하위 도메인 패턴에 따라 서비스 분해

서비스 분해 조건

단일 책임 원칙 -> 클래스는 오직 하나의 변경 사유를 가져야 한다

공동 폐쇄 원칙 -> 패키지의 클래스들은 동일한 유형의 변경에 대해 닫혀 있어야 한다. 패키지에 영향을 주는 변경은 그 패키지에 속한 모든 클래스에 영향을 끼친다.

 

서비스 분해의 장애물
  • 네트워크 지연(분산 시스템의 고질적 문제)
  • 동기 IPC로 인한 가용성 저하(REST 프로토콜 가용성 저하)
  • 여러 서비스에 걸쳐 데이터 일관성 유지(사가로 해결)
  • 일관된 데이터 뷰 확보(여러 DB에서 동일한 데이터 뷰 유지 어려움)
  • 만능 클래스는 분해의 걸림돌(공통 라이브러리 및 만능 라이브러리 지양)
서비스 API 정의

요청의 시작점부터 구분하여 특정 시스템 작업을 서비스로 배정해야 함

그리고 서비스 간의 협동을 설계

 

예시

  • 소비자 서비스: 소비자가 주문을 할 수 있는지 확인하고 소비자의 지불 정보를 획득합니다.
  • 음식점 서비스: 주문 품목이 올바른지, 소비자가 요청한 배달 주소/시간에 맞추어 해당 음식점이 준비 가능한지, 최소 주문량 이상인지 확인 후 주문 품목별 단가 정보를 조회합니다.
  • 주방 서비스: 티켓을 생성합니다.
  • 회계 서비스: 소비자 신용카드를 승인합니다.

해당 서비스에 따라 서비스간의 관계 및 작업 협동자 설계

서비스

작업

협동자

소비자 서비스

verifyConsumerDetails()

-

주문 서비스

createOrder()

소비자 서비스: verifyConsumerDetails()

음식점 서비스: verifyOrderDetails()

주방 서비스: createTicket()

회계 서비스: authorizeCard()

음식점 서비스

findAvailableRestaurants()

verifyOrderDetails()

-

주방 서비스

createTicket()

acceptOrder()

noteOrderReadyForPickup()

배달 서비스: scheduleDelivery()

배달 서비스

scheduleDelivery()

noteUpdatedLocation()

noteDeliveryPickedUp()

noteDeliveryDelivered()

-

회계 서비스

authorizeCard()

-