기능

<aside> 🔥

정확한 재고 수량 관리 : 플래시 세일, 이벤트 할인 등 대규모 트래픽 상황에서 다수의 사용자가 동시에 재고를 구매하려고 시도할 수 있습니다. 이때 재고 부족 상황이 발생하지 않도록, 여러 프로세스나 인스턴스에서 재고 관리가 가능하도록 하였습니다.

</aside>

<aside> 🔥

경쟁 상태(race condition)를 방지 : Redis 분산 락을 사용하여 한 번에 하나의 프로세스만 재고를 감소할 수 있어, 동시에 여러 프로세스가 재고를 변경하는 것을 방지하였습니다.

</aside>

Redis 분산 락을 적용한 재고 관리의 예시 시나리오

  1. 고객이 플래시 세일 중 상품을 구매하려고 합니다.
  2. 재고가 부족할 경우, 재고 부족 에러를 반환하고, 결제를 진행하지 않습니다.
  3. Order 서비스는 주문 및 결제가 완료되면 Product 서비스에 재고 감소 요청을 합니다.
  4. Product 서비스에서 Redisson 을 활용하여 재고 감소를 위한 락을 획득합니다.
  5. 락이 성공적으로 획득되면, 재고 감소 작업을 실행하고, 결과를 데이터베이스에 저장합니다.
  6. 작업이 완료되면 Redis에서 락을 해제합니다.
  7. 다른 인스턴스나 프로세스는 락이 해제된 후에 재고 감소 작업을 시도합니다.

구현 방법

  1. Redisson 사용
  2. 락을 획득할 자원에 대한 고유한 키 lockKey = productId
  3. lockAndExecute 메서드 호출로 락을 획득한 후 실행할 비즈니스 로직을 포함하도록 구현
  4. 만약 락을 획득하지 못한 경우에는 재시도하는 전략을 사용
  5. 락 획득 시도 제한: maxRetries를 통해 락 획득 시도 횟수를 제한함으로써, 무한 대기하지 않도록 방지
Product updatedProduct = redisLockService
            .lockAndExecute("product_stock_lock:" + productId, () ->
                    productService.decreaseStock(productId, request.quantit()));