

이벤트를 생상하는 모듈과 이벤트에 대응하는 모듈을 분리하고 상호 독립적으로 동작하여 병렬 처리를 촉진한다. 발신자와 수신자를 장소와 시간에서 쉽게 분리가 가능하다. 또한, 느슨한 결합으로 인해 확장성 및 수정 가능성에 많은 이점을 제공한다.
마이크로 서비스 간의 호출은 어떻게 할까?
각 서비스의 로컬 트랜잭션을 순차적으로 처리하는 패턴이다. 각 로컬 트랜잭션은 자신의 데이터베이스를 업데이트한 후, SAGA 내에 있는 다음 로컬 트랜잭션을 트리거하는 메시지 또는 이벤트를 게시하는 기법이다.
보상 트랜잭션이란?
: 어떤 서비스에서 트랜잭션 처리에 실패할 경우, 서비스의 앞선 다른 서비스에서 처리된 트랜잭션을 되돌리게 하는 트랜잭션
즉, SAGA는 일관성 유지가 필요한 트랜잭션을 하나의 트랜잭션으로 처리하지 않고, 각각의 로컬 트랜잭션으로 분리하여 순차적으로 처리하는 방법이다. 그러다 트랜잭션이 실패한 경우 이전 로컬 트랜잭션이 작성한 변경 사항을 취소하는 일련의 보상 트랜잭션을 통해 전체의 일관성을 유지한다.
CQRS(Command Query Responsibility Segregation) 패턴은 MSA에서 가장 효율적인 패턴이다. 기존의 일반적 개념이었던 동일한 저장소에 데이터를 넣고, 입력/수정/삭제/조회하는 방식에 도전하는 흥미로운 패러다임을 도입했다.
사용자의 요청(상태 변경, 상태 조회) 중에 조회 요청이 변경 요청보다 더 많다. 이를 위해 하나의 저장소에 읽기와 쓰기를 분리하거나 다른 저장소에 저장한다.
하지만 이런 구조에서는 쓰기 서비스가 사용되는 시점에서 조회 서비스의 데이터와 일관성이 깨지게 된다. 이때 데이터 일관성 유지를 위한 이벤트 주도 아키텍처가 등장한다.
쓰기 활동 시, 메시지 브로커에 이벤트를 전달하고, 조회는 메시지 브로커의 이벤트를 보고 저장소를 최신 상태로 동기화한다. 물론 시간적 텀이 있지만, 결과적으로 동일해짐
=> 결과적 일관성 (Eventual Consistency)!!
즉, 이벤트 주도 아키텍처는 이벤트를 사용하여 정보를 전달하고, 마이크로 서비스간의 결합도를 낮춰 유연성과 확장성을 높인다. 뿐만 아니라 CQRS의 데이터 일관성을 위해 사용된다.
어떻게 각각의 서비스를 비즈니스 독립적으로 식별할 수 있을까?
서비스 내부 구조화 측면에서 어떻게 기술과 독립적인 비즈니스 모델을 잘 설계할 수 있을까?
전략적 설계
: 비즈니스 전문가와 설계자/개발자가 비즈니스를 개념화하기위해 유비쿼터스 언어라는 것을 사용한다. 유비쿼터스 랭귀지를 통해 비즈니스의 컨텍스트를 식별하고 그 컨텍스트 중심으로 시스템의 경계를 설정하는데 이것을 바운디드 컨텍스트라 한다. 이것은 마이크로서비스 식별후보가 된다
전술적 설계
: 헥사고날 아키텍처의 내부 영역에 존재하는 기술로, 도메인 모델은 비즈니스 도메인의 개념을 잘 표현한 객체지향 모델이다.