이벤트 소싱 패턴 - AWS 규범적 지침

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

이벤트 소싱 패턴

이벤트 소싱 패턴은 일반적으로 CQRS 패턴 과 함께 사용하여 읽기 워크로드와 쓰기 워크로드를 분리하고 성능, 확장성 및 보안을 최적화합니다. 데이터는 데이터 스토어에 직접 업데이트되는 대신 일련의 이벤트로 저장됩니다. 마이크로서비스는 이벤트 저장소의 이벤트를 재생하여 자체 데이터 스토어의 적절한 상태를 계산합니다. 이 패턴은 애플리케이션의 현재 상태에 대한 가시성과 애플리케이션이 어떻게 해당 상태에 도달했는지에 대한 추가 컨텍스트를 제공합니다. 명령 및 쿼리 데이터 스토어의 스키마가 다르더라도 특정 이벤트에 대한 데이터를 복제할 수 있기 때문에 이벤트 소싱 패턴은 CQRS 패턴과 효과적으로 작동합니다.

이 패턴을 선택하면 특정 시점의 애플리케이션 상태를 식별하고 재구성할 수 있습니다. 이를 통해 지속적인 감사 추적이 생성되고 디버깅이 더 쉬워집니다. 그러나 데이터는 결국 일관성을 가지게 되므로 일부 사용 사례에는 적합하지 않을 수 있습니다.

이 패턴은 Amazon Kinesis Data Streams 또는 Amazon을 사용하여 구현할 수 있습니다. EventBridge

Amazon Kinesis Data Streams 구현

다음 그림에서 Kinesis Data Streams는 중앙 집중식 이벤트 저장소의 주요 구성 요소입니다. 이벤트 저장소는 애플리케이션 변경 사항을 이벤트로 캡처하여 Amazon Simple Storage Service(S3)에 유지합니다.

Amazon Kinesis Data Streams 구현

워크플로우는 다음 단계로 구성됩니다:

  1. “/withdraw” 또는 “/credit” 마이크로서비스에서 이벤트 상태 변경이 발생하면 Kinesis Data Streams에 메시지를 작성하여 이벤트를 게시합니다.

  2. “/balance” 또는 “/creditLimit”과 같은 기타 마이크로서비스는 메시지 사본을 읽고 관련성을 기준으로 필터링한 다음 추가 처리를 위해 전달합니다.

아마존 EventBridge 구현

다음 그림의 아키텍처는 다음을 사용합니다 EventBridge. EventBridge 이벤트를 사용하여 애플리케이션 구성 요소를 연결하는 서버리스 서비스로서, 이를 통해 확장 가능한 이벤트 기반 애플리케이션을 쉽게 구축할 수 있습니다. 이벤트 기반 아키텍처는 이벤트를 내보내고 이에 응답하여 함께 작동하는 느슨하게 결합된 소프트웨어 시스템을 구축하는 스타일입니다. EventBridge AWS서비스에서 게시하는 이벤트에 대한 기본 이벤트 버스를 제공하며 도메인별 버스를 위한 사용자 지정 이벤트 버스를 만들 수도 있습니다.

아마존 EventBridge 구현

이 워크플로우는 다음 단계로 구성됩니다.

  1. “OrderPlaced" 이벤트는 “Orders” 마이크로서비스에 의해 사용자 지정 이벤트 버스에 게시됩니다.

  2. “/route” 마이크로서비스와 같이 주문 후 조치를 취해야 하는 마이크로서비스는 규칙과 대상에 따라 시작됩니다.

  3. 이러한 마이크로서비스는 주문을 고객에게 배송하는 경로를 생성하고 "" RouteCreated 이벤트를 생성합니다.

  4. 추가 조치가 필요한 마이크로서비스도 "" 이벤트에 의해 시작됩니다. RouteCreated

  5. 이벤트는 이벤트 아카이브 (예: EventBridge 아카이브) 로 전송되므로 필요한 경우 이벤트를 재생하여 재처리할 수 있습니다.

  6. 필요한 경우 이전 주문 이벤트가 재처리를 위해 새 Amazon SQS 대기열 (재생 대기열) 으로 전송됩니다.

  7. 대상이 시작되지 않은 경우 영향을 받는 이벤트는 추가 분석 및 재처리를 위해 배달 못한 편지 대기열(DLQ)에 배치됩니다.

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

  • 이벤트는 애플리케이션 상태를 완전히 재구축하는 데 사용됩니다.

  • 시스템에서 이벤트를 재생하고 언제든지 애플리케이션 상태를 확인할 수 있어야 합니다.

  • 빈 애플리케이션 상태로 시작하지 않고도 특정 이벤트를 되돌릴 수 있기를 원합니다.

  • 시스템에는 자동 로그를 생성하기 위해 쉽게 직렬화할 수 있는 이벤트 스트림이 필요합니다.

  • 시스템에는 많은 읽기 작업이 필요하지만 쓰기 작업은 적습니다. 따라서 읽기 작업이 많으면 이벤트 스트림으로 계속 업데이트되는 인 메모리 데이터베이스로 보낼 수 있습니다.

중요

이벤트 소싱 패턴을 사용하는 경우 마이크로서비스 전반에서 데이터 일관성을 유지하기 위해 Saga pattern을 배포해야 합니다.