1. 개요


Redis를 활용하여 객실 선점 기능을 구현하며, 예약 요청 시 프로세스에 들어가기 전에 Redis에서 객실 재고를 차감해 선점하고, 예약 확정 단계에서 MySQL에서 재고를 차감하는 방식으로 진행했습니다. 이 과정에서 Redis와 MySQL 데이터가 이중으로 수정됨에 따라 두 데이터베이스의 정합성을 어떻게 유지할 것인지가 주요 과제로 떠올랐습니다.

<aside> 🎯

목표

  1. Redis와 MySQL에 저장된 객실 재고의 정합성을 어떻게 유지할 것인가?
  2. 정합성이 틀어지는 상황을 어떻게 감지할 것이며, 발생 시 이를 어떻게 해결할 것인가? </aside>

2. 접근 방안


초기에 예약 요청 처리 시 Redis와 MySQL 데이터를 동시에 수정하는 로직을 유지하며, 스케줄러를 활용해 주기적으로 Redis와 DB의 객실 재고를 조회 및 대조한 뒤, 정합성이 틀어진 경우 Redis 또는 DB 정보를 수정하는 방향으로 접근했습니다.

<aside> 🔥

해당 접근 방식에서 발생하는 문제는 다음과 같습니다:

따라서, 예약 API에서는 Redis의 값만 차감하고, 스케줄러를 통해 해당 값을 MySQL로 동기화하는 방식으로 방향을 잡았습니다. 이 과정에서 Redis 값 자체가 맞지 않을 가능성을 고려해야 합니다. 이를 위해 Redis에 비해 신뢰성이 높은 DB의 실제 예약(실제 객실 증차감) 이력과 Redis 값을 비교하여 정합성을 검증하는 작업이 필요합니다. 또한, DB 역시 실패할 가능성이 있으므로 로그 등 외부 데이터와 대조하는 작업도 필요할 것으로 예상했습니다.

3. 기술 적용


3.1 Apache Kafka

3.2 Spring Batch

3.3. 분산락 (Redisson)

4. 처리 Flow