CQRS 및 이벤트 소싱을 사용하여 모놀리식 유형을 마이크로서비스로 분해하기 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

CQRS 및 이벤트 소싱을 사용하여 모놀리식 유형을 마이크로서비스로 분해하기

작성자: Rodolfo Jr. Cerrada(AWS), Dmitry Gulin(AWS), Tabby Ward(AWS)

환경: PoC 또는 파일럿

소스: 모놀리식 CRUD 모델

대상: 마이크로서비스

R 유형: 리아키텍트

워크로드: 오픈 소스

기술: 현대화, 메시징 및 통신, 서버리스

AWS 서비스: Amazon DynamoDB, AWS Lambda, Amazon SNS

요약

이 패턴은 명령 쿼리 책임 분리(CQRS) 패턴과 이벤트 소싱 패턴을 모두 사용하는 두 가지 패턴을 결합합니다. CQRS 패턴은 명령 모델과 쿼리 모델의 책임을 구분합니다. 이벤트 소싱 패턴은 비동기 이벤트 기반 통신을 활용하여 전반적인 사용자 경험을 개선합니다.

CQRS 및 Amazon Web Services(AWS) 서비스를 사용하여 각 데이터 모델을 독립적으로 유지 관리하고 규모를 조정하는 동시에 모놀리식 애플리케이션을 마이크로서비스 아키텍처로 리팩터링할 수 있습니다. 그런 다음 이벤트 소싱 패턴을 사용하여 명령 데이터베이스의 데이터를 쿼리 데이터베이스와 동기화할 수 있습니다.

이 패턴은 최신 버전의 Visual Studio를 사용하여 열 수 있는 솔루션(*.sln) 파일이 포함된 예제 코드를 사용합니다. 이 예제에는 AWS 서버리스 및 기존 또는 온프레미스 애플리케이션에서 CQRS 및 이벤트 소싱이 어떻게 작동하는지 보여주는 Reward API 코드가 포함되어 있습니다.

CQRS 및 이벤트 소싱에 대해 자세히 알아보려면 추가 정보 섹션을 참조하십시오.

사전 조건 및 제한 사항

사전 조건 

  • 활성 상태의 AWS 계정

  • 아마존 CloudWatch

  • Amazon DynamoDB 테이블

  • Amazon DynamoDB Streams

  • AWS Identity and Access Management(IAM) 액세스 키 및 보안 키에 관한 자세한 내용은 관련 리소스 섹션의 동영상을 참조하십시오.

  • Lambda

  • Visual Studio에 대한 지식

  • AWS Toolkit for Visual Studio에 대한 지식, 자세한 내용은 관련 리소스 섹션의 AWS Toolkit for Visual Studio 데모 비디오를 참조하십시오.

제품 버전

제한 사항

  • 기존 온프레미스 애플리케이션(ASP.NET Core Web API 및 데이터 액세스 개체)의 예제 코드는 데이터베이스와 함께 제공되지 않습니다. 하지만 여기에는 모의 데이터베이스 역할을 하는 CustomerData 인 메모리 객체가 함께 제공됩니다. 제공된 코드는 패턴을 테스트하기에 충분합니다.

아키텍처

소스 기술 스택

  • ASP.NET Core Web API 프로젝트

  • IIS 웹 서버

  • 데이터 액세스 객체

  • CRUD 모델

소스 아키텍처

소스 아키텍처에서 CRUD 모델은 하나의 애플리케이션에 명령 인터페이스와 쿼리 인터페이스를 모두 포함합니다. 예제 코드는 CustomerDAO.cs(첨부)를 참조하십시오.

애플리케이션, 서비스 인터페이스, 고객 CRUD 모델 및 데이터베이스 간의 연결.

대상 기술 스택

  • Amazon DynamoDB

  • Amazon DynamoDB Streams

  • Lambda

  • (선택 사항) Amazon API Gateway

  • (선택 사항) Amazon Simple Notification Service(SNS)

대상 아키텍처 

대상 아키텍처에서는 명령 인터페이스와 쿼리 인터페이스가 분리되어 있습니다. 다음 다이어그램에 표시된 아키텍처는 API Gateway와 Amazon SNS를 사용하여 확장할 수 있습니다. 자세한 내용은 추가 정보 섹션을 참조하세요.

서버리스 고객 명령 및 고객 쿼리 마이크로서비스와 연결되는 애플리케이션.
  1. 명령 Lambda 함수는 데이터베이스에서 생성, 업데이트 또는 삭제와 같은 쓰기 작업을 수행합니다.

  2. 쿼리 Lambda 함수는 데이터베이스에서 가져오기 또는 선택과 같은 읽기 작업을 수행합니다.

  3. 이 Lambda 함수는 명령 데이터베이스의 DynamoDB 스트림을 처리하고 변경 사항에 맞게 쿼리 데이터베이스를 업데이트합니다.

도구

도구

  • Amazon DynamoDB는 완전 관리형 NoSQL 데이터베이스 서비스로서 원활한 확장성과 함께 빠르고 예측 가능한 성능을 제공합니다.

  • Amazon DynamoDB Streams - DynamoDB Streams는 어떤 DynamoDB 테이블이든 시간 순서에 따라 항목 수준 수정을 캡처합니다. 그런 다음 이 정보를 최대 24시간 동안 로그에 저장합니다. 유휴 시 암호화는 DynamoDB Streams의 데이터를 암호화합니다.

  • AWS Lambda – AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행하도록 지원하는 컴퓨팅 서비스입니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다. 사용한 컴퓨팅 시간만큼만 비용을 지불하고, 코드가 실행되지 않을 때는 요금이 부과되지 않습니다.

  • AWS Management Console - AWS Management Console은 AWS 서비스 관리를 위한 다양한 서비스 콘솔의 모음을 구성하는 웹 애플리케이션입니다.

  • Visual Studio 2019 Community Edition - Visual Studio 2019는 통합 개발 환경(IDE) 입니다. Community Edition은 오픈 소스 기여자에게 무료로 제공됩니다. 이 패턴에서는 Visual Studio 2019 Community Edition을 사용하여 예제 코드를 열고 컴파일하고 실행합니다. 보기 전용으로 모든 텍스트 편집기 또는 Visual Studio Code를 사용할 수 있습니다.

  • AWS Toolkit for Visual Studio - AWS Toolkit for Visual Studio는 Visual Studio IDE용 플러그인입니다. AWS Toolkit for Visual Studio는 AWS 서비스를 사용하는 .NET 애플리케이션을 더 쉽게 개발, 디버깅 및 배포할 수 있도록 도와줍니다.

code

예제 코드가 첨부되어 있습니다. 예제 코드 배포에 대한 지침은 에픽 섹션을 참조하십시오.

에픽

작업설명필요한 기술

섹션을 여십시오.

  1. 첨부 섹션에서 예제 소스 코드(CQRS-ES Code.zip)를 다운로드하고 파일을 추출합니다.

  2. Visual Studio IDE에서 파일, 열기, 프로젝트 솔루션을 선택하고 소스 코드를 추출한 폴더로 이동합니다.

  3. AWS.APG.CQRSES.sln을 선택한 다음, 열기를 선택합니다. 전체 솔루션이 Visual Studio에 로드됩니다.

앱 개발자

솔루션을 빌드합니다.

솔루션의 컨텍스트 메뉴(마우스 오른쪽 버튼 클릭)를 연 다음 솔루션 빌드를 선택합니다. 그러면 솔루션의 모든 프로젝트가 빌드되고 컴파일됩니다. 성공적으로 컴파일될 것입니다.

Visual Studio 솔루션 탐색기에 디렉터리 구조가 표시되어야 합니다.

  • CQRS On-Premises Code Sample에는 온프레미스에서 CQRS를 사용하는 예제가 포함되어 있습니다.

  • CQRS AWS Serverless에는 AWS 서버리스 서비스를 사용하는 모든 CQRS 및 이벤트 소싱 예제 코드가 포함되어 있습니다.

앱 개발자
작업설명필요한 기술

보안 인증을 제공합니다.

아직 액세스 키가 없는 경우 관련 리소스 섹션의 비디오를 참조하십시오.

  1. 솔루션 탐색기에서 CQRS AWS 서버리스를 확장한 다음 빌드 솔루션 폴더를 확장합니다.

  2. AwS.APG.CQRSES.Build 프로젝트를 확장하고 Program.cs 파일을 확인합니다.

  3. Program.cs의 맨 위로 스크롤하여 Program()을 검색합니다.

  4. YOUR ACCESS KEY를 계정 액세스 키로 바꾸고 YOUR SECRET KEY를 계정 비밀 키로 바꾸십시오. 프로덕션 환경에서는 키를 하드코딩하지 않는다는 점에 유의하십시오. 대신 AWS Secrets Manager를 사용하여 보안 인증을 저장하고 검색할 수 있습니다.

앱 개발자, 데이터 엔지니어, DBA

프로젝트를 빌드합니다.

프로젝트를 구축하려면 AwS.APG.CQRSES.Build 프로젝트의 컨텍스트 메뉴(마우스 오른쪽 버튼 클릭)를 연 다음, 빌드를 선택합니다.

앱 개발자, 데이터 엔지니어, DBA

테이블을 빌드하고 채웁니다.

테이블을 빌드하고 시드 데이터로 채우려면 AwS.APG.CQRSES.Build 프로젝트의 컨텍스트 메뉴(마우스 오른쪽 버튼 클릭)를 열고 디버그, 새 인스턴스 시작을 선택합니다.

앱 개발자, 데이터 엔지니어, DBA

테이블 구성과 데이터를 확인합니다.

확인하려면 AWS 탐색기로 이동하여 Amazon DynamoDB를 확장하십시오. 테이블이 표시되어야 합니다. 각 테이블을 열어 예제 데이터를 표시합니다.

앱 개발자, 데이터 엔지니어, DBA
작업설명필요한 기술

CQRS 프로젝트를 빌드합니다.

  1. 솔루션을 열고 CQRS AWS 서비스/CQRS/테스트 솔루션 폴더로 이동합니다.

  2. AWS.apg.cqrses.cqrsLambda.Tests 프로젝트에서.cs를 열고 생성한 IAM 키로 및 를 교체합니다. BaseFunctionTest AccessKeySecretKey

  3. 변경 사항을 저장합니다.

  4. 프로젝트를 빌드하려면 프로젝트의 컨텍스트 메뉴(마우스 오른쪽 버튼 클릭)를 연 다음, 빌드를 선택합니다.

앱 개발자, 테스트 엔지니어

이벤트 소싱 프로젝트를 빌드하십시오.

  1. CQRS AWS 서비스/이벤트 소스/테스트 솔루션 폴더로 이동합니다. 

  2. AWS.APG.CQRSES에서 EventSourceLambda.Tests BaseFunctionTest프로젝트에서.cs를 열고 생성한 IAM 키로 와 를 AccessKey교체합니다. SecretKey  

  3. 변경 사항을 저장합니다.

  4. 프로젝트를 빌드하려면 프로젝트의 컨텍스트 메뉴(마우스 오른쪽 버튼 클릭)를 연 다음, 빌드를 선택합니다.

앱 개발자, 테스트 엔지니어

테스트를 실행합니다.

모든 테스트를 실행하려면 보기, 테스트 탐색기를 선택한 다음 보기에서 모든 테스트 실행를 선택합니다. 모든 테스트를 통과해야 하며, 이는 녹색 확인 표시 아이콘으로 표시됩니다. 

앱 개발자, 테스트 엔지니어
작업설명필요한 기술

첫 번째 Lambda 함수를 게시하십시오.

  1. 솔루션 탐색기에서 AWS.APG.CQRSES의 컨텍스트 (마우스 오른쪽 버튼 클릭) 메뉴를 엽니다. CommandCreateLambda 프로젝트를 선택한 다음 AWS Lambda에 게시를 선택합니다.

  2. 사용하려는 프로필, Lambda 함수를 배포하려는 AWS 리전 및 함수 이름을 선택합니다.

  3. 나머지 필드의 기본값을 유지하고 다음을 선택합니다.

  4. 역할 이름 드롭다운 목록에서 선택합니다. AWSLambdaFullAccess

  5. 계정 키를 제공하려면 추가를 선택하고 변수로 AcessKey를 입력하고 액세스 키를 값으로 입력합니다. 그런 다음 추가를 다시 선택하고, 변수로 SecretKey를 그리고 값으로 비밀 키를 입력합니다.

  6. 나머지 필드의 경우 기본값을 유지하고 업로드를 선택합니다. Lambda 테스트 함수가 업로드되면 Visual Studio에 자동으로 표시됩니다.

  7. 다음 프로젝트에 대해 1~6단계를 반복합니다.

    • AWS.APG.CQRSES. CommandDeleteLambda

    • AWS.APG.CQRSES. CommandUpdateLambda

    • AWS.APG.CQRSES. CommandAddRewardLambda

    • AWS.APG.CQRSES. CommandRedeemRewardLambda

    • AWS.APG.CQRSES. QueryCustomerListLambda

    • AWS.APG.CQRSES. QueryRewqardLambda

앱 개발자, DevOps 엔지니어

함수 업로드를 확인합니다.

(선택 사항) AWS 탐색기로 이동하여 AWS Lambda를 확장하여 함수가 성공적으로 로드되었는지 확인할 수 있습니다. 테스트 창을 열려면 Lambda 함수를 선택합니다(두 번 클릭).

앱 개발자, DevOps 엔지니어

Lambda 함수를 테스트합니다.

  1. 요청 데이터를 입력하거나 추가 정보 섹션의 테스트 데이터에서 예제 요청 데이터를 복사합니다. 테스트 중인 함수에 대한 데이터를 선택했는지 확인하십시오.

  2. 테스트를 실행하려면 Invoke를 선택합니다. 응답 및 오류는 응답 텍스트 상자에 표시되고 로그는 로그 텍스트 상자 또는 로그에 CloudWatch 표시됩니다.

  3. 데이터를 확인하려면 AWS 탐색기에서 DynamoDB 테이블을 선택합니다(두 번 클릭).

모든 CQRS Lambda 프로젝트는 CQRS AWS Serverless\CQRS\Command Microservice CQRS AWS Serverless\CQRS\Command Microservice 솔루션 폴더 아래에 있습니다. 솔루션 디렉터리 및 프로젝트는 추가 정보 섹션의 소스 코드 디렉터리를 참조하십시오.

앱 개발자, DevOps 엔지니어

나머지 함수를 게시합니다.

다음 프로젝트에 대해 이전 단계를 반복합니다.

  • AWS.APG.CQRSES. CommandDeleteLambda

  • AWS.APG.CQRSES. CommandUpdateLambda

  • AWS.APG.CQRSES. CommandAddRewardLambda

  • AWS.APG.CQRSES. CommandRedeemRewardLambda

  • AWS.APG.CQRSES. QueryCustomerListLambda

  • AWS.APG.CQRSES. QueryRewqardLambda

앱 개발자, DevOps 엔지니어
작업설명필요한 기술

고객 및 보상 Lambda 이벤트 핸들러를 게시합니다.

각 이벤트 핸들러를 게시하려면 이전 에픽의 단계를 따르십시오.

프로젝트는 CQRS AWS Serverless\Event Source\Customer EventCQRS AWS Serverless\Event Source\Reward Event 솔루션 폴더 아래에 있습니다. 자세한 내용은 추가 정보 섹션의 소스 코드 디렉터리를 참조하십시오.

앱 개발자

이벤트 소싱 Lambda 이벤트 리스너를 연결합니다.

  1. Lambda 프로젝트를 게시할 때 사용한 것과 동일한 계정을 사용하여 AWS Management Console에 로그인합니다.

  2. 리전의 경우 미국 동부 1 또는 이전 에픽에서 Lambda 함수를 배포한 리전을 선택합니다.

  3. Lambda 서비스로 이동합니다.

  4. EventSourceCustomer Lambda 함수를 선택합니다.

  5. 트리거 추가를 선택합니다.

  6. 트리거 구성 드롭다운 목록에서 DynamoDB를 선택합니다.

  7. DynamoDB 테이블 드롭다운 목록에서 을 선택합니다. cqrses-customer-cmd

  8. 시작 위치 드롭다운 목록에서 수평 트리밍을 선택합니다. 수평 트리밍은 DynamoDB 트리거가 샤드에서 가장 오래된 레코드인 마지막(트리밍되지 않은) 스트림 레코드에서 읽기를 시작하는 것을 의미합니다.

  9. 트리거 활성 확인란을 선택합니다.

  10. 나머지 필드의 경우 기본값을 유지하고 추가를 선택합니다.

리스너가 DynamoDB 테이블에 성공적으로 연결되면 Lambda 디자이너 페이지에 리스너가 표시됩니다.

앱 개발자

EventSourceReward Lambda 함수를 게시하고 연결합니다.

EventSourceRewardLambda 함수를 게시하고 연결하려면 DynamoDB 테이블 드롭다운 목록에서 선택하여 이전 두 스토리의 단계를 반복합니다. cqrses-reward-cmd

앱 개발자
작업설명필요한 기술

스트림과 Lambda 트리거를 테스트합니다.

  1. Visual Studio에서 AWS 탐색기로 이동합니다.

  2. AWS Lambda를 확장하고 함수를 선택합니다 (CommandRedeemReward두 번 클릭). 함수 창이 열리면 함수를 테스트할 수 있습니다.

  3. 요청 텍스트 상자에 요청 데이터를 JavaScript 객체 표기법 (JSON) 형식으로 입력합니다. 예제 요청은 추가 정보 섹션의 테스트 데이터를 참조하십시오.

  4. Invoke를 선택합니다.

앱 개발자

DynamodDB 보상 쿼리 테이블을 사용하여 검증합니다.

  1. 테이블을 엽니다. cqrses-reward-query

  2. 리워드를 사용한 고객의 포인트를 확인하십시오. 사용한 포인트는 고객의 총 누적 포인트에서 차감해야 합니다.

앱 개발자

CloudWatch 로그를 사용하여 검증하십시오.

  1. 로그 그룹으로 CloudWatch 이동하여 선택합니다.

  2. /aws/lambda/ EventSourceReward 로그 그룹에는 트리거에 대한 로그가 포함되어 있습니다. EventSourceReward Lambda 코드에서 context.Logger.LogLineConsole.Writeline에 입력한 메시지를 포함하여 모든 Lambda 직접 호출이 기록됩니다.

앱 개발자

트리거를 EventSourceCustomer 검증합니다.

EventSourceCustomer트리거를 검증하려면 트리거의 해당 고객 테이블과 CloudWatch 로그를 사용하여 이 에픽의 단계를 반복하세요. EventSourceCustomer

앱 개발자

관련 리소스

참조

비디오

추가 정보

CQRS 및 이벤트 소싱

CQRS

CQRS 패턴은 데이터 액세스 객체 단일 CRUD(생성, 읽기, 업데이트, 삭제) 모델과 같은 단일 개념적 운영 모델을 명령 및 쿼리 운영 모델로 구분합니다. 명령 모델은 생성, 업데이트 또는 삭제와 같이 상태를 변경하는 모든 작업을 말합니다. 쿼리 모델은 값을 반환하는 모든 작업을 가리킵니다.

서비스 인터페이스, CRUD 모델 및 데이터베이스를 포함하는 아키텍처.
  1. 고객 CRUD 모델에는 다음과 같은 인터페이스가 포함됩니다.

    • Create Customer()

    • UpdateCustomer()

    • DeleteCustomer()

    • AddPoints()

    • RedeemPoints()

    • GetVIPCustomers()

    • GetCustomerList()

    • GetCustomerPoints()

요구 사항이 더욱 복잡해지면 이 단일 모델 접근 방식을 벗어나도 됩니다. CQRS는 명령 모델과 쿼리 모델을 사용하여 데이터 쓰기 및 읽기 책임을 분리합니다. 이렇게 하면 데이터를 독립적으로 유지 관리하고 관리할 수 있습니다. 책임을 명확히 구분하면 각 모델의 개선이 다른 모델에는 영향을 미치지 않습니다. 이렇게 분리하면 유지 관리 및 성능이 향상되고 애플리케이션이 성장함에 따라 복잡성이 줄어듭니다.

애플리케이션은 명령 및 쿼리 모델로 분리되어 단일 데이터베이스를 공유합니다.
  1. 고객 명령 모델의 인터페이스.

    • Create Customer()

    • UpdateCustomer()

    • DeleteCustomer()

    • AddPoints()

    • RedeemPoints()

  2. 고객 쿼리 모델의 인터페이스.

    • GetVIPCustomers()

    • GetCustomerList()

    • GetCustomerPoints()

    • GetMonthlyStatement()

예제 코드는 소스 코드 디렉터리를 참조하십시오.

그런 다음 CQRS 패턴은 데이터베이스를 분리합니다. 이러한 디커플링은 각 서비스의 완전한 독립성으로 이어지며, 이는 마이크로서비스 아키텍처의 주요 요소입니다.

명령 및 쿼리 모델을 위한 별도의 데이터베이스.

AWS 클라우드에서 CQRS를 사용하면 각 서비스를 추가로 최적화할 수 있습니다. 예를 들어, 다양한 컴퓨팅 설정을 지정하거나 서버리스 또는 컨테이너 기반 마이크로서비스 중에서 선택할 수 있습니다. 온프레미스 캐싱을 Amazon으로 대체할 수 있습니다. ElastiCache 온프레미스 게시/구독 메시징이 있는 경우 Amazon Simple Notification Service(SNS)로 대체할 수 있습니다. 또한 pay-as-you-go 요금은 물론 사용한 만큼만 지불하는 다양한 AWS 서비스를 이용할 수 있습니다.

CQRS에는 다음과 같은 이점이 있습니다.

  • 독립적 규모 조정 - 각 모델은 서비스의 요구 사항 및 수요를 충족하도록 확장 전략을 조정할 수 있습니다. 고성능 애플리케이션과 마찬가지로 읽기와 쓰기를 분리하면 모델을 독립적으로 규모를 조정하여 각 요구 사항을 충족할 수 있습니다. 또한 컴퓨팅 리소스를 추가하거나 줄여 다른 모델에 영향을 주지 않으면서 한 모델의 확장성 요구를 해결할 수 있습니다.

  • 독립적 유지 관리 - 쿼리와 명령 모델을 분리하면 모델의 유지 관리 용이성이 향상됩니다. 다른 모델에는 영향을 주지 않으면서 한 모델의 코드를 변경하고 개선할 수 있습니다.

  • 보안 - 읽기 및 쓰기를 위해 별도의 모델에 권한과 정책을 적용하는 것이 더 쉽습니다.

  • 읽기 최적화 - 쿼리에 최적화된 스키마를 정의할 수 있습니다. 예를 들어, 집계된 데이터에 대한 스키마를 정의하고 팩트 테이블에 대해 별도의 스키마를 정의할 수 있습니다.

  • 통합 - CQRS는 이벤트 기반 프로그래밍 모델에 적합합니다.

  • 복잡성 관리 - 쿼리와 명령 모델로의 분리는 복잡한 도메인에 적합합니다.

CQRS를 사용할 때는 다음 주의 사항을 명심하십시오.

  • CQRS 패턴은 애플리케이션의 특정 부분에만 적용되며 전체 애플리케이션에는 적용되지 않습니다. 패턴에 맞지 않는 도메인에 구현하면 생산성이 저하되고 위험이 증가하며 복잡성이 생길 수 있습니다.

  • 이 패턴은 읽기 및 쓰기 작업이 불균형하고 자주 사용되는 모델에 가장 적합합니다.

  • 처리하는 데 시간이 걸리는 대용량 보고서와 같이 읽기 중심의 애플리케이션의 경우 CQRS는 적절한 데이터베이스를 선택하고 집계된 데이터를 저장할 스키마를 생성할 수 있는 옵션을 제공합니다. 이렇게 하면 보고서 데이터를 한 번만 처리하고 집계된 테이블에 덤프하므로 보고서를 읽고 보는 응답 시간이 향상됩니다.

  • 쓰기가 많은 애플리케이션의 경우 쓰기 작업을 위해 데이터베이스를 구성하고 쓰기 수요가 증가할 때 명령 마이크로서비스가 독립적으로 규모가 조정되도록 할 수 있습니다. 예제는 AWS.APG.CQRSES.CommandRedeemRewardLambdaAWS.APG.CQRSES.CommandAddRewardLambda 마이크로서비스를 참조하십시오.

이벤트 소싱

다음 단계는 명령 실행 시 이벤트 소싱을 사용하여 쿼리 데이터베이스를 동기화하는 것입니다. 예를 들어 다음 이벤트를 고려합니다.

  • 고객 보상 포인트가 추가되어 쿼리 데이터베이스의 고객 총 보상 포인트 또는 집계된 보상 포인트를 업데이트해야 합니다.

  • 명령 데이터베이스에서 고객의 성이 업데이트되므로 쿼리 데이터베이스의 대리 고객 정보를 업데이트해야 합니다.

기존 CRUD 모델에서는 트랜잭션이 완료될 때까지 데이터를 잠가서 데이터의 일관성을 보장합니다. 이벤트 소싱에서는 구독자가 해당 데이터를 업데이트하는 데 사용하는 일련의 이벤트 게시를 통해 데이터가 동기화됩니다.

이벤트 소싱 패턴은 데이터에 대해 취해진 일련의 전체 조치를 보장 및 기록하고 일련의 이벤트를 통해 데이터를 게시합니다. 이러한 이벤트는 해당 이벤트의 구독자가 기록을 최신 상태로 유지하기 위해 처리해야 하는 일련의 데이터 변경 사항을 나타냅니다. 이러한 이벤트는 구독자가 소비하여 구독자 데이터베이스의 데이터를 동기화합니다. 이 경우에는 쿼리 데이터베이스가 바로 그것입니다.

다음 다이어그램은 AWS 기반 CQRS에서 사용되는 이벤트 소싱을 보여줍니다.

AWS 서버리스 서비스를 사용하는 CQRS 및 이벤트 소싱 패턴을 위한 마이크로서비스 아키텍처.
  1. 명령 Lambda 함수는 데이터베이스에서 생성, 업데이트 또는 삭제와 같은 쓰기 작업을 수행합니다.

  2. 쿼리 Lambda 함수는 데이터베이스에서 가져오기 또는 선택과 같은 읽기 작업을 수행합니다.

  3. 이 Lambda 함수는 명령 데이터베이스의 DynamoDB 스트림을 처리하고 변경 사항에 맞게 쿼리 데이터베이스를 업데이트합니다. 또한 이 함수를 사용하여 Amazon SNS에 메시지를 게시하여 구독자가 데이터를 처리할 수 있도록 할 수도 있습니다.

  4. (선택 사항) Lambda 이벤트 구독자는 Amazon SNS에서 게시한 메시지를 처리하고 쿼리 데이터베이스를 업데이트합니다.

  5. (선택 사항) Amazon SNS는 쓰기 작업에 대한 이메일 알림을 보냅니다.

AWS에서는 DynamoDB 스트림으로 쿼리 데이터베이스를 동기화할 수 있습니다. DynamoDB는 DynamoDB 테이블에서 시간 순서에 따라 항목 수준 수정을 거의 실시간으로 캡처하고 24시간 내에 정보를 안정적으로 저장합니다.

DynamoDB 스트림을 활성화하면 데이터베이스에서 이벤트 소싱 패턴을 가능하게 하는 일련의 이벤트를 게시할 수 있습니다. 이벤트 소싱 패턴은 이벤트 구독자를 추가합니다. 이벤트 구독자 애플리케이션은 이벤트를 소비하고 구독자의 책임에 따라 이벤트를 처리합니다. 이전 다이어그램에서 이벤트 구독자는 변경 내용을 쿼리 DynamoDB 데이터베이스에 푸시하여 데이터를 동기화된 상태로 유지합니다. Amazon SNS, 메시지 브로커 및 이벤트 구독자 애플리케이션을 사용하면 아키텍처가 분리된 상태로 유지됩니다.

이벤트 소싱에는 다음과 같은 이점이 있습니다.

  • 트랜잭션 데이터의 일관성

  • 데이터에서 취해진 조치를 모니터링하는 데 사용 가능한 신뢰할 수 있는 감사 추적 및 작업 기록

  • 마이크로서비스와 같은 분산 애플리케이션에 환경 전반에서 걸쳐 데이터 동기화 허용

  • 상태가 변경될 때마다 신뢰할 수 있는 이벤트 게시

  • 과거 상태 재구성 또는 재생

  • 모놀리식 애플리케이션에서 마이크로서비스로의 마이그레이션을 위해 이벤트를 교환하는 느슨하게 결합된 엔터티

  • 동시 업데이트로 인한 충돌 감소, 이벤트 소싱 사용으로 데이터 스토어에서 객체 직접 업데이트 불필요

  • 작업과 이벤트를 분리하는 데 따른 유연성 및 확장성

  • 외부 시스템 업데이트

  • 단일 이벤트에서 여러 작업 관리

이벤트 소싱을 사용할 때는 다음 주의 사항을 명심하십시오.

  • 소스 구독자 데이터베이스 간에 데이터를 업데이트하는 데 약간의 지연이 있기 때문에 변경을 취소할 수 있는 유일한 방법은 이벤트 저장소에 보상 이벤트를 추가하는 것입니다.

  • 이벤트 소싱은 프로그래밍 스타일이 다르기 때문에 구현을 익히는 데 시간이 많이 걸립니다.

테스트 데이터

배포 성공 후 다음 테스트 데이터를 사용하여 Lambda 함수를 테스트하십시오.

CommandCreate 고객

{ "Id":1501, "Firstname":"John", "Lastname":"Done", "CompanyName":"AnyCompany", "Address": "USA", "VIP":true }

CommandUpdate 고객

{ "Id":1501, "Firstname":"John", "Lastname":"Doe", "CompanyName":"Example Corp.", "Address": "Seattle, USA", "VIP":true }

CommandDelete 고객

고객 ID를 요청 데이터로 입력합니다. 예를 들어 고객 ID가 151인 경우 요청 데이터로 151을 입력합니다.

151

QueryCustomerList

이것은 비어 있습니다. 간접 호출되면 모든 고객이 반환됩니다.

CommandAddReward

그러면 ID 1(리차드)인 고객에게 40포인트가 추가됩니다.

{ "Id":10101, "CustomerId":1, "Points":40 }

CommandRedeemReward

그러면 ID 1(리차드)인 고객에게 15포인트가 차감됩니다.

{ "Id":10110, "CustomerId":1, "Points":15 }

QueryReward

고객 ID를 입력합니다. 예를 들어 리처드의 경우 1, Arnav의 경우 2, 셜리의 경우 3을 입력합니다.

2

소스 코드 디렉터리

다음 테이블을 Visual Studio 솔루션의 디렉터리 구조에 대한 지침으로 사용하십시오. 

CQRS 온프레미스 코드 샘플 솔루션 디렉터리

명령 및 쿼리 서비스가 확장된 솔루션 디렉토리.

고객 CRUD 모델

CQRS On-Premises Code Sample\CRUD Model\AWS.APG.CQRSES.DAL 프로젝트

고객 CRUD 모델의 CQRS 버전

  • 고객 명령: CQRS On-Premises Code Sample\CQRS Model\Command Microservice\AWS.APG.CQRSES.Command 프로젝트

  • 고객 쿼리: CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Query 프로젝트

명령 및 쿼리 마이크로서비스

Command 마이크로서비스는 솔루션 폴더 CQRS On-Premises Code Sample\CQRS Model\Command Microservice 아래에 있습니다.

  • AWS.APG.CQRSES.CommandMicroservice ASP.NET Core API 프로젝트는 소비자가 서비스와 상호 작용하는 진입점 역할을 합니다.

  • AWS.APG.CQRSES.Command .NET Core 프로젝트는 명령 관련 객체 및 인터페이스를 호스팅하는 객체입니다.

쿼리 마이크로서비스는 솔루션 폴더 CQRS On-Premises Code Sample\CQRS Model\Query Microservice 아래에 있습니다.

  • AWS.APG.CQRSES.QueryMicroservice ASP.NET Core API 프로젝트는 소비자가 서비스와 상호 작용하는 진입점 역할을 합니다.

  • AWS.APG.CQRSES.Query .NET Core 프로젝트는 쿼리 관련 객체 및 인터페이스를 호스팅하는 객체입니다.

CQRS AWS 서버리스 코드 솔루션 디렉터리

마이크로서비스와 이벤트 소스를 모두 표시하는 솔루션 디렉토리가 확장되었습니다.

이 코드는 AWS 서버리스 서비스를 사용하는 온프레미스 코드의 AWS 버전입니다.

C# .NET Core에서 각 Lambda 함수는 하나의 .NET 코어 프로젝트로 표현됩니다. 이 패턴의 예제 코드에는 명령 및 쿼리 모델의 각 인터페이스에 대해 별도의 프로젝트가 있습니다.

AWS services를 사용한 CQRS

AWS 서버리스 서비스를 사용하는 CQRS용 루트 솔루션 디렉터리는 CQRS AWS Serverless\CQRS 폴더에서 찾을 수 있습니다. 이 예제에는 고객과 보상이라는 두 가지 모델이 포함됩니다.

고객 및 보상에 대한 명령 Lambda 함수는 CQRS\Command Microservice\CustomerCQRS\Command Microservice\Reward 폴더 아래에 있습니다. 여기에는 다음과 같은 Lambda 프로젝트가 포함됩니다.

  • 고객 명령:CommandCreateLambda, CommandDeleteLambdaCommandUpdateLambda

  • 보상 명령: CommandAddRewardLambdaCommandRedeemRewardLambda

고객 및 보상에 대한 쿼리 Lambda 함수는 CQRS\Query Microservice\CustomerCQRS\QueryMicroservice\Reward 폴더 아래에 있습니다. 여기에는 QueryCustomerListLambdaQueryRewardLambda Lambda 프로젝트가 포함됩니다.

CQRS 테스트 프로젝트

테스트 프로젝트는 CQRS\Tests 폴더 아래에 있습니다. 이 프로젝트에는 CQRS Lambda 함수 테스트를 자동화하는 테스트 스크립트가 포함되어 있습니다.

AWS 서비스를 사용한 이벤트 소싱

다음 Lambda 이벤트 핸들러는 고객 및 보상 DynamoDB 스트림에 의해 시작되어 쿼리 테이블의 데이터를 처리하고 동기화합니다.

  • EventSourceCustomer Lambda 함수는 고객 테이블(cqrses-customer-cmd) DynamoDB 스트림에 매핑됩니다.

  • EventSourceReward Lambda 함수는 보상 테이블(cqrses-reward-cmd) DynamoDB 스트림에 매핑됩니다.

첨부

이 문서와 관련된 추가 콘텐츠에 액세스하려면 attachment.zip 파일의 압축을 풉니다.