피드로 돌아가기
Dev.toBackend
원문 읽기
Kafka Streams 기반 Event Sourcing 도입으로 Error Rate 18%에서 0.02%로 절감
The Day Our Treasure Hunt Engine Blew Up at 3 AM (And How We Rebuilt It Right)
AI 요약
Context
PostgreSQL의 SERIAL 컬럼 기반 카운터 구조로 인한 Row-level Lock의 Table-level 확장 발생. 2,000 Concurrent Writes 상황에서 Deadlock 및 직렬화 실패로 인해 에러율 18% 급증 및 보상금 누락으로 인한 47K 달러의 손실 발생.
Technical Solution
- PostgreSQL 카운터를 제거하고 모든 헌트 액션을 Immutable Event로 처리하는 Kafka Streams 기반 Event Sourcing 아키텍처로 전환
- RocksDB 기반 Materialized View를 구축하여 Kafka 토픽을 소비하고 리더보드 상태를 In-memory로 유지하는 구조 설계
- Hunt ID 기준 파티셔닝을 통해 리더보드 쿼리가 단일 RocksDB 파티션만 참조하도록 하여 쿼리 효율성 극대화
- RocksDB의 내장 캐싱 메커니즘을 활용해 Hot 리더보드는 메모리에 유지하고 Cold 데이터는 디스크로 처리하는 계층형 저장 전략 적용
- Event Log 기반의 Replay 기능을 구현하여 데이터 손상 시 복구 가능성과 보상 지급의 Exactly-once Semantics 확보
- 운영 복잡도 증가와 RocksDB Compaction Pause 리스크를 감수하는 대신 수평 확장성과 데이터 정합성을 선택한 Trade-off 결정
실천 포인트
RDBMS의 단일 Row 업데이트 병목 시 단순 Sharding보다 Event Sourcing 기반의 상태 재구축 구조를 검토하고, 특히 RocksDB 도입 시 Compaction Interval 튜닝과 Disk IOPS 확보를 통한 STW(Stop-the-world) 현상을 사전 방지하십시오.