
뱅크샐러드가 게임을 만들 때 데이터 정합성을 유지하는 법 (feat. 낙관적 락)
두줄요약
현금성 게임 재화의 정합성을 위해 시간 차분 정산과 낙관적 락을 결합했습니다. 버전 기반 CAS 구현과 복제 지연·재시도 운영 원칙을 공유합니다.
문제 상황
- 현금 전환 가능한 게임 재화 SAL과 에너지·레벨 상태의 동시 업데이트
- 사용자 API, 백오피스 수동 조정, 향후 배치·비동기 이벤트에 따른 레이스 컨디션 위험
선택 이유
- 사용자별로 격리된 캐릭터 상태에 따른 낮은 충돌 확률
- DB 잠금 대기와 Redis 기반 분산 락 인프라 복잡도 회피
- 시간 차분 기반 보상 정산으로 충돌 요청의 보상 누락 방지
구조와 흐름
- 정적 character와 빈번히 변경되는 character_state 테이블 분리
- update_version 조건을 포함한 UPDATE 쿼리로 원자적 CAS 수행
- 업데이트 행 수 0건을 동시성 충돌로 감지하고 다음 액션에서 미정산 보상 합산
성능/운영 포인트
- 정합성이 중요한 상태 변경 경로의 Primary DB 조회 강제
- 재시도 필요 시 최신 데이터 재조회, 지수 백오프·지터, 멱등성, 최대 횟수 제한 적용
- 타임스탬프 대신 정수형 버전 필드 사용으로 시간 정밀도와 클럭 스큐 문제 회피


