이벤트 소싱을 활용한 디스코드 메시지 기록 관리
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 실시간 채팅 애플리케이션 개발자
- 데이터 저장 및 검색 최적화에 관심 있는 개발자
- 고확장성 아키텍처 설계자
- 난이도: 중급~고급 (이벤트 소싱, 데이터 분할, 인덱싱 기술 요구)
핵심 요약
- 이벤트 소싱을 통해 메시지 기록의 불변성과 일관성을 보장
- 핫/콜드 데이터 분리 (Cassandra + S3 + RocksDB)로 검색 성능 최적화
- 일일 스냅샷과 5분 단위 이벤트 청크로 로드 시간 50ms 달성
- 소프트딜리트 및 필터링 프로젝션으로 삭제 처리 효율성 향상
섹션별 세부 요약
1. 이벤트 소싱 기초
- 모든 메시지가 이벤트 객체로 저장됨 (예:
{"event_id":"msg_abc123", "channel_id":"xyz789", ...}
) - 불변성 보장: 수정/삭제 시 새로운 이벤트 생성 (예:
{"event_id":"del_abc123", "target_message_id":"msg_xyz456"}
) - 이벤트 기반 프로젝션으로 실시간 뷰 생성 (SQL + Elasticsearch 활용)
2. 데이터 저장 및 검색 최적화
- 핫 데이터 (최근 메시지): Cassandra (저지연 읽기)
- 콜드 데이터 (구형 메시지): S3 + RocksDB (비용 효율성)
- 99%의 쿼리가 30일 이내 데이터에 집중 → 해당 영역에 최적화
3. 스냅샷과 이벤트 청크 처리
- 일일 스냅샷 저장: 채널 상태의 매일 기준 포인트
- 이벤트 청크 (5분 단위)로 분할: 병렬 처리 및 중복 메타데이터 제거
- 로드 시간 50ms 달성 (기존 5s 대비 100배 개선)
4. 삭제 처리 및 법적 데이터 정리
- 프로젝션에서 삭제 필터링:
WHERE deleted = false
- 데이터 정리:
- 가명화: 사용자 ID/내용을 [REDACTED]
로 대체
- 콜드 스토리지 정리: X년 이상 청크 일괄 삭제
결론
- 이벤트 소싱을 도입할 때는 불변 이벤트와 핫/콜드 데이터 분리를 우선 적용
- 일일 스냅샷 대신 실시간 스냅샷으로 확장 가능
- GDPR 등 법적 요구사항을 고려한 삭제 처리 전략 필수
- 작은 규모부터 시작해 (예: 사용자 밴, 결제 이벤트 로깅) 점진적으로 확장하세요.