스냅샷 전략: 이벤트 재생 최적화
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
DevOps
대상자
- 대상: 이벤트 소싱(Event Sourcing)을 사용하는 백엔드 개발자 및 시스템 아키텍처 설계자
- 난이도: 중급~고급 (이벤트 소싱 및 성능 최적화 기술 이해 필요)
핵심 요약
- 이벤트 소싱의 한계: 1M 이벤트 재생 시 수분 소요, 읽기 API 타임아웃, 테스트 속도 저하
- 스냅샷의 역할: 최신 이벤트만 재생하여 100ms 이상의 재생 지연이 발생하는 핫 애그리게이트에 최적
- 핵심 구현 방식:
- AccountSnapshot.take(account_id)
→ 1,000 이벤트 간격으로 현재 상태 저장
- DeltaSnapshot.save(account_id, new_events)
→ 델타(변화량) 저장으로 저장공간 최적화
섹션별 세부 요약
1. 이벤트 소싱의 한계
- slow reads:
GET /users/123
→ 5초 재생 지연 - high memory usage: 이벤트 처리 시 OOM(Out of Memory) 발생
- frequent replays: 동일 애그리게이트의 중복 재생으로 성능 저하
2. 스냅샷 기능 원리
- N 이벤트 간격으로 현재 상태 저장 (예:
1,000 이벤트
단위) - 재생 시: 최신 스냅샷 + 이후 이벤트 적용 (예:
AccountProjection.apply(snapshot.state, new_events)
)
3. 최적화 전략
- read-heavy API: 첫 번째 재생 후 캐시 저장 (예:
Rails.cache.fetch("snapshot/#{account_id}")
) - high-write 시스템: 델타 저장으로 전체 스냅샷 대체 (예:
DeltaStore.append(account_id, deltas)
)
4. 흔한 문제 및 해결책
- 이벤트 손실: 체크섬 스냅샷(SHA 해시)으로 불일치 시 재구성
- 스토리지 부하: 적응형 스냅샷(cold 애그리게이트는 적게 생성)
- 동시 스냅샷 생성: 비관적 락(optimistic locking)으로 데이터 손실 방지
결론
- 스냅샷은 이벤트 소싱의 성능 최적화 핵심 도구
- 핫 애그리게이트는 100ms 이상 재생 지연 시 사용, 델타 저장으로 저장공간 절감
- 체크섬, 적응형 스냅샷, 비관적 락을 병행하여 시스템 안정성 및 확장성 확보