CQRS 의 구현 수준
CQRS 를 구현할 때, 무작정 저장소를 분리한다고 해서 좋은 것이 아닙니다. 현재 상황에 맞게 적절한 수준의 CQRS 를 적용해야 시스템적 복잡성을 최소화 하면서도 성능적 이득은 가장 크게 얻는, 가성비 좋은 CQRS 구현이 가능합니다.
CQRS 의 구현 수준
단계 | 이름 | 설명 |
---|---|---|
레벨 1 | 코드 수준 분리 (CQS) | - 동일 데이터 저장소 사용, 서비스/메서드만 분리 |
레벨 2 | 모델 수준 분리 | - 동일 데이터 저장소 사용, 테이블이나 스키마를 분리 |
레벨 3 | 저장소 수준 분리 (CQRS) | - 데이터 저장소를 분리 |
레벨1 코드 수준 분리(CQS)
- 분리 수준 : Command 와 Query 코드만 분리하는 수준의 책임 분리, 동일 저장소 사용
- 예시 : Command 와 Query 서비스 혹은 메서드 분리
- 장점 : 변경 사항이 적음, 복잡성 증가 정도가 낮음
- 단점 : 성능 개선 효과 미미
레벨2 모델 수준 분리
- 분리 수준 : 동일한 저장소 사용, 테이블이나 스키마를 분리
- 예시 : Command 용 정규화된 테이블, Query 용 반정규화된 테이블을 분리해 운용
- 장점 : Command - 인덱싱 최소화, Query - 조인 최소화로 성능 향상
- 단점 : 동일 DB 내 리소스 경함, 트랜잭션 락
- 중간 정도의 복잡성 증가를 보임
레벨3 저장소 수준 분리(CQRS)
- 분리 수준 : Command 용 저장소와 Query 용 저장소로 저장소를 분리
- 예시 : Command - RDBMS 사용 / Query - 검색엔진 사용
- 장점 : Command 와 Query 각각에 최적화된 저장소 기술 채택, 확장성 좋음
- 단점 : 시스템 복잡성 증가, 데이터 동기화 구현 필요
데이터 동기화 방식
동기식/비동기식 업데이트
구분 | 동기식 업데이트 | 비동기식 업데이트 |
---|---|---|
방법 | Command 처리시 Query용 데이터 모델에도 변경사항을 즉시 반영 | Command 처리 후 Query용 데이터 모델에 비동기식 업데이트 |
장점 | - 일관성 보장이 용이함 - 구현 단순 |
- 확장성이 좋음 - 필요할 때 업데이트 하므로 성능적 이득 - 느슨한 결합 |
단점 | - 실시간 동기화로 인한 성능 감소 - Command 와 Query 데이터 모델 간 결합도 증가 |
- 최종적인 일관성을 보장하기에 복잡 - 동기화 지연시간이 발생함 |
데이터 동기화 기술 선택
동기화 기술 | 설명 |
---|---|
데이터베이스 트리거 | - DB 내부 트리거로 변경사항 발생시 자동으로 Query 저장소에 반영 - 구현이 간단함 - 유지보수와 확장성에 한계가 있음 |
어플리케이션 레벨 동기화 | - 애플리케이션 레벨에서 직접 Query 저장소 업데이트 - 로직 통제가 쉬웁 - 코드 복잡도가 다소 높아질 수 있음 |
메시지 큐/이벤트 스트림 | - 이벤트 발행-구독 기반 비동기 동기화 - Kafka, RabbitMQ 등을 사용 - 확장성이 높음 - 결함에 대한 내성이 강함 |
CDC Change Data Capture |
- DB 로그를 모니터링해 데이터 변경을 감지하고 Query 저장소에 반영 - 구현이 단순함 - 실시간성이 부족, 데이터 지연 발생 가능 |
배치 프로세스 | - 주기적으로 데이터를 동기화하는 접근 방법 |
일관성 보장의 강도
CQRS 에서 말하는 일관성이란?
- 원본 데이터와 복제본 간의 일치도를 뜻함
- 다른 말로 복제 일관성이라고 할 수 있음
- Command 저장소(모델)와 Query 저장소(모델)간 동일한 상태를 유지하는 강도와 실시간성
- 즉, Command 발생시 그 결과가 Query 모델에 얼마나 빠르고 정확하게 반영되는가
복제 일관성 전략
일관성 강도 | 설명 |
---|---|
강한 일관성 | - Command 작업 완료 즉시 Query 모델에도 반영 - 항상 최신 데이터를 제공 - 장점 : 일관성 보장이 용이 - 단점 : 성능 저하, 결합도 증가 - 적용 포인트 : 정확도가 중요한 비즈니스 로직, 재고가 한정된 경우 |
인과적 일관성 | - 사용자의 직접적인 Command 작업에 대한 결과는 Query에 바로 반영 - 그 외의 데이터 변경은 시간차를 두고 Query 에 반영 - 장점 : 사용자 경험 향상, 성능 저하 최소화 - 단점 : 시스템 복잡도 증가, 사용자 간 데이터 불일치 가능 - 적용 포인트 : SNS 에서 내가 쓴 글 바로 보기 |
최종 일관성 | - Command 작업 후 일정 시간 내 Query 모델에 반영 - 일시적으로는 불일치가 있을 수 있음 - 장점 : 확장성 우수, 시스템 간 결합도 낮음 - 단점 : 데이터 지연 발생, 복잡한 설계 - 적용 포인트 : 상품 목록 조회, 대시보드 등 일반적인 조회 기능 |
맞춤형 일관성 | - 사용자별/기능별 차별화된 일관성 정책 적용 - 적용 포인트 : SNS 에서 일반인, 인플루언서 간 다른 일관성 정책 |
최종 일관성으로 갈 수록 성능 이득이 크고,
강한 일관성으로 갈 수록 실시간성 이득이 크다.
실제 사례
호텔 예약 시스템
- Command : 객실 예약 시 트랜잭션으로 정확한 재고 관리
- Query : 검색 결과에는 최종 일관성을 적용해 성능 이득, 일부 불일치 허용
- 검색 후 최종 예약 단계에서 재고 확인해 불일치 방지 : 강한 일관성
- 예약 완료 후 내 예약 내역 바로 확인 가능 : 인과적 일관성
소셜 네트워크 서비스
- Command : 게시물 생성, 댓글, 좋아요 등 액션은 트랜잭션으로 정확하게 처리
- Query : 타임라인, 친구 활동, 트렌드 토픽은 최종 일관성으로 확장성 확보
- 타인 활동은 몇 초간 지연 동기화 허용 : 최종 일관성
- 자신의 액션은 바로 피드에 반영 : 인과적 일관성
Reference
Wanted 커리어 프리온보딩 - 2-4년차 백엔드를 위한 CQRS 패턴과 실시간 데이터 처리
Comments