CQRS 패턴 - AWS 권장 가이드

CQRS 패턴

CQRS(명령 쿼리 책임 분리) 패턴은 데이터 변형 또는 시스템의 명령 부분을 쿼리 부분과 분리합니다. 처리량, 지연 시간 또는 일관성에 대한 요구 사항이 서로 다른 경우 CQRS 패턴을 사용하여 업데이트와 쿼리를 분리할 수 있습니다. CQRS 패턴은 다음 그림과 같이 애플리케이션을 명령 측과 쿼리 측의 두 부분으로 나눕니다. 명령 측은 create, update, delete 요청을 처리합니다. 쿼리 측에서는 읽기 전용 복제본을 사용하여 query 부분을 실행합니다.

CQRS 패턴의 개괄적인 보기

이 다이어그램은 다음 프로세스를 보여줍니다.

  1. 비즈니스는 API를 통해 명령을 전송하여 애플리케이션과 상호 작용합니다. 명령은 데이터 생성, 업데이트 또는 삭제와 같은 작업입니다.

  2. 애플리케이션은 명령 측에서 들어오는 명령을 처리합니다. 이 과정에는 검증, 권한 부여, 연산 실행이 포함됩니다.

  3. 애플리케이션은 명령 데이터를 쓰기(명령) 데이터베이스에 저장합니다.

  4. 명령이 쓰기 데이터베이스에 저장된 후, 이벤트가 트리거되어 읽기(쿼리) 데이터베이스의 데이터를 업데이트합니다.

  5. 읽기(쿼리) 데이터베이스는 데이터를 처리하고 저장합니다. 읽기 데이터베이스는 특정 쿼리 요구 사항에 최적화되도록 설계됩니다.

  6. 비즈니스는 읽기 API를 통해 애플리케이션의 쿼리 측에 쿼리를 전송합니다.

  7. 애플리케이션은 쿼리 측에서 들어오는 쿼리를 처리하고 읽기 데이터베이스에서 데이터를 가져옵니다.

CQRS 패턴은 다음과 같은 다양한 데이터베이스 조합으로 구현할 수 있습니다.

다음 그림에서는 DynamoDB와 같은 NoSQL 데이터 저장소를 사용하여 쓰기 처리량을 최적화하고 유연한 쿼리 기능을 제공합니다. 따라서 데이터를 추가할 때 액세스 패턴이 잘 정의된 워크로드에서 쓰기 확장성이 향상됩니다. Amazon Aurora와 같은 관계형 데이터베이스는 복잡한 쿼리 기능을 제공합니다. DynamoDB 스트림은 Aurora 테이블을 업데이트하는 Lambda 함수로 데이터를 전송합니다.

AWS 서비스를 사용하여 구현된 CQRS 패턴

DynamoDB와 Aurora를 사용하여 CQRS 패턴을 구현하면 다음과 같은 주요 이점이 있습니다.

  • DynamoDB는 대량 쓰기 작업을 처리할 수 있는 완전 관리형 NoSQL 데이터베이스이며, Aurora는 쿼리 측에서 복잡한 쿼리에 대해 높은 읽기 확장성을 제공합니다.

  • DynamoDB는 짧은 지연 시간과 많은 처리량으로 데이터를 제공하므로 명령 및 업데이트 작업 처리에 적합하며, Aurora는 복잡한 쿼리에 대해 성능을 세밀하게 조정하고 최적화할 수 있습니다.

  • DynamoDB와 Aurora 모두 서버리스 옵션을 제공하므로, 사용한 리소스에 대해서만 비용을 지불할 수 있습니다.

  • DynamoDB와 Aurora는 완전 관리형 서비스이므로 데이터베이스 관리, 백업, 확장성에 따른 운영 부담을 줄일 수 있습니다.

다음과 같은 경우에는 CQRS 패턴을 사용하는 것이 좋습니다.

  • 서비스별 데이터베이스 패턴을 구현했고 여러 마이크로서비스의 데이터를 조인하려고 합니다.

  • 읽기 및 쓰기 워크로드에는 규모 조정, 지연 시간 및 일관성에 대한 별도의 요구 사항이 있습니다.

  • 최종 일관성은 읽기 쿼리에 사용할 수 있습니다.

중요

CQRS 패턴은 일반적으로 데이터 저장소 간의 최종 일관성을 초래합니다.