
백엔드
뱅크샐러드가 게임을 만들 때 데이터 정합성을 유지하는 법 (feat. 낙관적 락)
두줄요약
뱅크샐러드는 게임형 앱테크 서비스의 데이터 정합성을 위해 낙관적 락을 적용했습니다. 버전 필드와 상태 분리, 시간 차분 정산으로 재시도 없이도 안정성을 확보했습니다.
문제 상황
- 게임형 앱테크 서비스에서 SAL과 에너지 같은 캐릭터 상태를 실시간으로 갱신해야 하는 상황
- 유저 액션과 운영자 백오피스 수정, 향후 배치·비동기 이벤트까지 겹치며 데이터 정합성 유지 필요성 증가
원인 분석
- 현금성 자산으로 전환 가능한 재화라서 레이스 컨디션이 곧 신뢰 저하로 직결
- 분산 환경에서 잘못된 동시성 제어는 기술적 부채와 운영 리스크로 확장
해결 방법
- 비관적 락과 분산 락을 검토한 뒤, 낮은 충돌 확률과 단순한 인프라 구성을 이유로 낙관적 락 채택
- update_version 버전 필드로 CAS 방식 검증을 수행하고, character와 character_state 분리로 락 범위 축소
- 시간 차분 기반 보상 정산과 자기 수정 구조로 재시도 로직 없이도 누락 없는 정산 유도
주의할 점
- updated_at 같은 시간값을 버전 필드로 쓰는 방식은 정밀도와 클럭 스큐 문제로 부적합
- 복제 지연 환경에서는 최신 버전 읽기를 보장하지 않으면 충돌률 상승
적용해볼 점
- 충돌을 장애가 아닌 제어 흐름으로 보고, 비즈니스 특성에 맞는 재시도·멱등성 전략을 함께 설계
- 정합성이 중요한 경로는 최신 데이터 조회를 강제해 stale read를 방지