이벤트를 발행(produce)하고 비동기 방식으로 필요한 곳에서 consume 한다
발생(produce)는 누락될 가능성이 거의 없다 (성공률이 높다)
이벤트 자체만으로는 어떤 도메인과도 직접적인 의존성이 없는 느신한 결합을 가능하게 만든다
Event Sourcing는 데이터 상태를 저장하는 대신, 시스템의 상태 변화를 나타내는 이벤트들의 순서를 기록하고 이 기록을 기반으로 현재 상태를 재구성하는 방법론입니다.
핵심 개념:
데이터의 상태 변경이 이벤트로 저장됩니다.
시간 순서로 저장된다.
모든 상태는 기록된 이벤트를 재생(Replay)하여 복원됩니다.
이벤트는 이벤트 스트림으로 저장.
특징:
이력 관리: 시스템의 모든 변경 사항을 추적하고, 과거 상태를 복원할 수 있습니다.
디버깅과 감사: 이벤트 로그를 통해 왜 특정 상태가 되었는지 추적 가능.
Event Store: 전통적인 DB 대신 이벤트 저장소를 사용.
사용 예:
금융 시스템 (거래 기록 추적).
비즈니스 규칙이 복잡한 도메인.
이벤트 기반 시스템의 데이터 무결성 보장.
장점:
데이터 변경이력 추적과 감시에 유용하다.
은행 계좌
은행은 현재 잔액만 저장하는 것이 아니라, 모든 입출금 내역을 기록합니다.
예를 들어:
쇼핑몰 주문 시스템
상황: 고객이 쇼핑몰에서 상품을 주문하고, 결제, 배송 등의 상태가 변하는 과정을 관리해야 합니다.
Event-Driven(이벤트 중심)은 이벤트를 중심으로 시스템이 동작하는 패턴으로, 이벤트가 발생했을 때 이를 감지하고 처리하는 방식입니다.
핵심 개념:
이벤트 프로듀서가 이벤트를 발생시키고, 이벤트 컨슈머가 이를 처리.
비동기적으로 동작하며, 느슨하게 결합된 시스템 설계.
특징:
비동기성: 이벤트가 발생하면 즉시 처리되거나, 적절한 시점에 처리됨.
느슨한 결합: 컴포넌트 간 직접적인 의존성 감소.
확장성: 이벤트 기반으로 컴포넌트를 쉽게 추가 가능.
사용 예:
알림 시스템 (SMS, 이메일).
IoT 환경 (센서 데이터 처리).
메시징 플랫폼 (Kafka, RabbitMQ).
이벤트 기준으로 모든 데이터의 변경을 처리, 조회
비즈니스를 이벤트를 기반으로 구현하는 방법
(이벤트 소싱 포함)
데이터의 변경
데이터의 조회
하나의 도메인(DB)를 특정할 수 있는 key(PK)를 조건으로 최종 버전 정보를 조회
장애나 서버, 인프라에 문제가 발생할 지라도 앱이 복구되면 메세지 브로커(이벤트)에 의존해서 일관성(트랜잭션)을 구현할 수 있다.
Event-Driven Architecture (EDA)는 Event-Driven 개념을 전체 시스템 설계에 적용한 구조로, 시스템 구성 요소가 이벤트를 생성, 소비, 처리하며 상호 작용합니다.
핵심 개념:
시스템이 이벤트 중심으로 설계됨.
프로듀서와 컨슈머가 독립적으로 동작하며, 이벤트 버스를 통해 통신.
특징:
확장성: 다양한 마이크로서비스가 이벤트 기반으로 확장 가능.
유연성: 변경 사항이 특정 컴포넌트에만 영향을 미침.
이벤트 브로커: Kafka, RabbitMQ, AWS SNS/SQS와 같은 브로커 사용.
사용 예:
마이크로서비스 아키텍처에서 서비스 간 통합.
실시간 데이터 처리 시스템.
대규모 분산 시스템.
전체적으로 아키텍처의 모든것을 이벤트를 기반으로 구현
Event-Driven Architecture
├── Event-Driven
│ ├── Event Sourcing (이벤트를 저장하고 상태 복원)
│ └── Saga 트랜잭션 오케스트레이션 (분산 트랜잭션 관리)
└── 시스템 간 통합 (이벤트를 기반으로 서비스 연결)
항목 | Event Sourcing | Event-Driven | Event-Driven Architecture |
---|---|---|---|
목적 | 데이터 상태 변화를 이벤트로 기록 | 이벤트 기반으로 동작하는 비동기 처리 | 이벤트 기반으로 시스템 전체를 설계 |
중점 | 데이터의 상태 복원 및 이력 관리 | 이벤트 생성과 처리 | 이벤트의 생성, 소비, 전파 |
주요 사용 기술 | Event Store (ex. Kafka, DB) | 메시징 시스템 (ex. RabbitMQ, Kafka) | 이벤트 브로커 (ex. Kafka, AWS SQS/SNS) |
적용 범위 | 데이터 관리 | 특정 이벤트 기반 프로세스 | 시스템 전반의 설계 |
예 | 금융 거래, 감사 시스템 | 알림 시스템, IoT 데이터 처리 | 마이크로서비스 통합, 실시간 처리 |
이 세 가지 개념은 서로 관련되어 있으나, 다루는 범위와 목적이 다릅니다. Event Sourcing은 데이터 관리에 집중하고, Event-Driven은 동작 방식에 초점을 맞추며, EDA는 시스템 전반의 설계를 아우릅니다.
Event Sourcing에서는 데이터의 최종상태를 바로 조회할 수 없다
따라서 데이터를 조회하려면 이벤트를 차례로 수행하여 현재 상태를 조회해야하기 때문에 조회에 비효율적이다
CQRS를 조합할 경우
읽기 모델과 쓰기 모델을 분리하여, 읽기 작업(Query)에서 이벤트 수행없이 최적화된 데이터를 바로 조회할 수 있다.
Event Sourcing으로 쓰기 작업을 처리하고,
CQRS의 Query Model을 사용해 읽기 성능을 개선하는 방법을 사용