Event Sourcing

Jae·2025년 6월 8일

개요

bytebytego에서 Event Sourcing에 대한 이야기가 나와서 찾아보게 되었다.

Event Sourcing

  1. 데이터 저장소의 상태 변경 기준으로 데이터를 저장한다. 따라서 상태 변경에 대한 모든 이력을 관리할 수 있으며, 과거 상황에 대한 추적 및 분석에 용이하다.
  2. MSA에서 유기적으로 작동하여 요청을 처리할 수 있고, 이벤트를 통해 통신한다.
  3. 이벤트 객체를 발생 순서대로 저장하여 데이터 엔터티의 현재 상태에 대한 중요한 정보와 해당 상태에 도달하게 된 경로에 대한 정보가 제공받을 수 있다.

고려 사항

  1. 낙관적 동시성 제어
  • 여러 사용자 또는 서비스가 동시에 동일한 데이터를 업데이트하려고 시도할 때 이벤트 충돌이 발생할 수 있다.
  • 해결 방안 : 데이터 내에 타임스탬프 추가나 버전 관리를 포함하여 우선 순위를 정함
  1. 복잡성
  • 기존의 CRUD 방식을 이벤트 기반 방식으로 변경해야하는 과정에서 오는 구현 및 시간 비용
  1. 최종일관성
  • 명령 쿼리 책임 분리(CQRS) 패턴 또는 구체화된 뷰를 사용하여 데이터를 업데이트하는 데 따른 지연 시간때문에 이벤트에서 파생된 데이터 프로젝션에서는 결국 일관성이 유지되는데, 소비자가 이벤트 스토어의 데이터를 처리하고 게시자가 새 데이터를 보내는 경우, 데이터 프로젝션 또는 애플리케이션 객체가 현재 상태를 반영하지 않을 수 있다.
  1. 쿼리
  • 이베트 로그에서 현재 또는 집계 데이트를 검색하는 작업은 기존 데이터베이스에 비해 더 복잡하고 느릴 수 있으며 복잡한 쿼리 및 데이터 수집성 작업은 시간이 많이 걸린다. 이러한 경우에는 CQRS가 유리할 수 있음.
  1. 이벤트 스토어의 크기 및 비용
  • 이벤트 처리량이 많거나 보존 기간이 긴 시스템의 경우 이벤트 스토어의 크기가 기하급수적으로 커질 수 있다. 따라서 정기적으로 이벤트 데이터를 비용 대비 효율적인 스토어로 바꿔줘야한다.
  1. 이벤트 스토어의 확장성
  • 대량의 쓰기 및 읽기 작업을 효율적으로 처리해야한다. 이벤트 스토어는 규모를 조정하기 어려울 수 있으므로, 샤드와 파티션을 제공하는 데이터 스토어를 사용하는 것이 중요하다.
  1. 효율성 및 최적화
  • 읽기/쓰기 모두 효율적인 곳으로 이벤트 스토어를 선택하거나 설계해야한다. 예상 이벤트 볼륨 및 쿼리 패턴에 맞게 최적화되어야한다. 인덱싱을 사용하여 이벤트 검색 속도도 고려하고, 특수 이벤트 상황에 대한 데이터베이스나 라이브러리 고려하는 것도 방법
  1. 스냅샷
  • 시간 기반 활성화를 통해 정기적으로 이벤트 로그를 백업해야한다. 가장 마지막으로 성공한 데이터를 백업하여 오류 발생시 복구할 수 있도록 하기.
  1. 시간 민감도
  • 발생 순서대로 저장을 하기 때문에 네트워크의 신뢰성이 매우 중요하며 FIFO를 적극 활용한다.
  1. 이벤트 재생 성능
  • 많은 수의 데이터를 활용하게 되면 시간이 많이 걸릴 수 있다. 보관된 데이터 사용시 성능을 개선하기 위한 최적화된 노력이 필요하다.
  1. 외부 시스템 업데이트
  • 외부 시스템의 데이터 스토어를 업데이트하고 이러한 업데이트를 이벤트 객체로 사용할 수 있다.
  1. 외부 시스템 쿼리
  • 외부 시스템의 직접적인 호출이 호출 날짜 및 시간에 민감할 경우, 수신된 데이터를 내부 데이터 스토어에 저장하여 재생 중에 사용한다.
  1. 이벤트 버전 관리
  • 애플리케이션의 발전에 따라 이벤트의 구조가 바뀔 수 있어서, 호환성을 보장하기 위해 버전 관리 전략을 잘 수립하여야한다.

구현

명령 및 이벤트

  • 상태 변경의 목적으로 서비스에 전송되는 명령 또는 요청을 나타낸다.

이벤트 스토어

  • 변경 불가하고 추가만 가능하여 시간순으로 정렬된 리포지토리 또는 이벤트 스토어라는 데이터에 기록된다.
  • 이벤트를 발생 순서대로 저장하여 초기 상태, 현재 상태 및 시점ㅈ 뷰가 알려진 엔터티 객체 또는 데이터 스토어를 재구성할 수 있다.
  • 모든 작업 및 상태 변경에 대한 기록 역할을 하며 신뢰할 수 있는 단일 소스로서 중요한 역할을 한다.
  • 저장하는 이벤트를 게시하고, 이벤트를 필터링하여 후속 작업을 위해 적절한 프로세서로 라우팅할 수 있다.

참고

https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/cloud-design-patterns/event-sourcing.html

0개의 댓글