우리는 처음에 "DB의 데이터는 언제나 실시간으로 정확해야 한다"는 대전제를 가지고 있었다.
하지만 대규모의 트래픽이 몰리는 선착순 주문 이벤트 환경에서 이 전제는 시스템의 가용성과 성능을 심각하게 저해하는 병목이 되었다.
우리는 RDBMS의 물리적 한계(Lock 대기, 커넥션 고갈)를 극복하기 위해 Redis Lua Script를 도입하여 재고 관리를 Redis로 옮겼다.
이로 인해 발생하는 Redis와 DB 간의 데이터 불일치를 해결해야 하며, 이를 위해 Eventual Consistency(최종적 일관성) 모델을 적용하고자 했다. 이때 다음 3가지 포인트를 두고 구현 방법에 대해 고민했다.
효율성 : 불필요한 DB I/O를 얼마나 줄일 수 있는가안전성 : 장애 발생 시 데이터 유실 위험은 없는가복구 : 데이터가 틀어졌을 때 얼마나 빠르고 정확하게 복구할 수 있는가Redis 재고가 0이 되는 순간(Sold Out), 이벤트를 발생시켜 DB를 0으로 업데이트하는 방식이다.