Print
카테고리: [ Cloud Computing & MSA ]
조회수: 15399

1. 개요

CQRS에 대해 알아본다.


2. CQRS (Command and Query Responsibility Segregation)

논리 이벤트 버스를 통한 애플리케이션 수준 통합 이벤트를 사용하여 타 마이크로 서비스 사이에 일관성을 달성한다.

CQRS의 적용 기준은 수행 비율이 높은 조회 서비스 중심, 생성 이벤트와 저장소 사이에 지연이 가능한 서비스 중심이다. 따라서 전체 요청 중 조회 처리 시간이 긴 것을 추출하여 적용하면 좋다. 그리고 시간적 민감도가 적을 수록 좋다.

변경하는 기능과 조회하는 기능을 분리하여 도메인을 구성한다.

2.1. 구조적 차이점

다양한 구조가 있는데 단일 Database 구조와 Polyglot 구조가 가능하다.

2.1.1. 단일 Database 구조

Database 자체는 공유하고 Command Model과 Query Model이 분리되어 있다. 쉽고 단순하지만 Database가 동일하기 때문에 성능 문제가 발생할 수 있다.

2.1.2. Polyglot 구조

Command Database와 Query Database를 분리한다. 그리고 메시지 브로커를 통해 데이터 동기화를 처리한다. 따라서 동기화 처리를 위한 메시지 브로커의 신뢰도, HA 방안 등이 고려되어야 한다. 각 모델에 가장 적합한 방식(RDBMS, NoSQL)을 택할 수 있다.

2.2. 구현


3. Event Sourcing과의 연관성

CQRS는 Event Soucing을 보완하는 역할을 한다.

모든 액션을 이벤트로 정의하고, 이벤트 스트림을 별도 Database에 저장한다. 따라서 여기서는 Insert 작업만 발생한다. 왜냐면 변경이나 삭제도 별도 이벤트이기 때문이다.

트랜잭션 처리의 경합이 없고 모든 이벤트가 저장되어 있기 때문에 rollback이 가능하다. 또 이벤트 드리븐 아키텍처에 적합하다.

다만 상태 불일치 발생 가능성이 있고 일관성 있는 데이터 뷰가 필요한 시스템, 실시간성 시스템에 적합하지 않다.