핵심 데이터전자상거래

플래시 세일과 재고

만 명의 쇼핑객이 같은 순간에 구매를 클릭해도 보유한 재고만큼 정확히 판매하고, 봇은 막아 냅니다.

재고 차감
원자적
초과 판매 수량
0
스스로 풀리는 보류
10분
단계 1 / 6
재고 적재

500개가 판매에 들어갑니다.

예시 세션playing
# 재고 적재
hotkv> SET stock:sneaker-x 500
OK

실제 HotKV 명령과 예시 응답으로 구성된 애니메이션 안내입니다. 원하는 단계를 클릭하면 해당 단계로 이동합니다. 명령과 응답은 HotKV에서 입력하고 보는 그대로 영어로 표시됩니다.

문제

플래시 세일에서는 가장 중요한 순간에 바로 재고 데이터베이스가 병목이 됩니다. 읽은 뒤 쓰는 검사는 동시성 아래에서 초과 판매를 일으키고, 버려진 장바구니는 재고를 영원히 묶어 두며, 실제 고객이 페이지를 다 불러오기도 전에 봇이 재고를 사 갑니다.

HotKV의 해결 방식

재고는 원자적으로 차감되는 카운터에 있으므로, 동시 구매자가 존재하는 수량보다 많이 가져갈 수 없습니다. 각 예약은 10분 만료가 있는 키이고, 고객별 속도 제한이 봇을 늦추며, 확정된 주문은 스트림에 들어가 주문 처리 시스템이 자기 속도로 처리합니다.

단계별 설명

명령 하나하나, 무슨 일이 일어나는가

  1. 01

    재고 적재

    500개가 판매에 들어갑니다.

    SET stock:sneaker-x 500
  2. 02

    봇 억제

    고객마다 10초에 두 번까지 시도할 수 있습니다. 봇은 즉시 이를 초과합니다.

    GCRA.LIMIT buy:customer:881 10000 2
  3. 03

    한 개 가져가기

    DECR은 원자적입니다. 10,000번의 동시 클릭도 500개를 넘게 가져갈 수 없습니다.

    DECR stock:sneaker-x
  4. 04

    10분 동안 보류

    결제를 포기하면 예약은 스스로 만료되고, 스위퍼가 재고를 되돌립니다.

    SET hold:sneaker-x:order-7781 customer:42 NX EX 600
  5. 05

    품절 처리

    DECR이 0 아래로 내려가면 재고를 되돌리고 쇼핑객에게 품절을 보여 줍니다. 재고가 음수인 상태는 오래가지 않습니다.

    INCR stock:sneaker-x
  6. 06

    주문 처리로 인계

    결제된 주문은 스트림에 추가됩니다. 창고 시스템이 자기 속도로 처리합니다.

    XADD orders * order 7781 sku sneaker-x customer 42
적용 분야

실제 시나리오

스니커즈와 굿즈 드롭

한정판이 단 한 켤레도 초과 판매되지 않고 몇 초 만에 매진됩니다.

티켓 판매

결제하는 동안 좌석을 몇 분간 보류하고, 구매자가 떠나면 자동으로 풀어 줍니다.

음식 및 식료품 배달

배달 시간대는 카운터이며, 고객이 예약할 때마다 원자적으로 차감됩니다.

내장 기능

제공되는 기능

원자적 카운터

DECR과 INCR이 경쟁 상태 없이 한 단계로 재고를 바꿉니다.

DECRINCRBY

만료되는 보류

예약은 TTL이 있는 키입니다.

SETNXEX

봇 방어

정확한 재시도 시간을 알려 주는 고객별 한도입니다.

GCRA.LIMIT

주문 인계

컨슈머 그룹과 확인 응답을 갖춘 주문 처리용 스트림입니다.

XADDXREADGROUP

자주 묻는 질문

만료된 보류는 어떻게 재고를 되돌립니까?

만료된 보류는 키스페이스 알림이나 주기적인 스윕으로 감지할 수 있으며, 이때 재고 카운터를 다시 증가시킵니다.

재고를 가져가지 않고 확인할 수 있습니까?

예. GET은 현재 수량을 반환합니다. 예약은 DECR만 합니다.

여러 상품이 담긴 장바구니는 어떻게 합니까?

MULTI와 EXEC 또는 함수를 사용해 여러 카운터를 함께 차감합니다.

관련 사용 사례

직접 워크로드로 사용해 보십시오

HotKV는 Redis 프로토콜을 사용하므로 기존 클라이언트를 연결해 같은 명령을 그대로 실행할 수 있습니다.