コアデータEコマース

フラッシュセールと在庫

1万人の買い物客が同じ1秒に購入をクリックしても手元の在庫を正確に販売し、ボットを締め出します。

在庫の減算
アトミック
過剰販売した数量
0
自動解放される確保
10 min
ステップ 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秒あたり2回まで試せます。ボットはすぐに上限を超えます。

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

    1個を確保

    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がゼロを下回ると、その1個は戻され、買い物客には売り切れと表示されます。在庫がマイナスのまま長く残ることはありません。

    INCR stock:sneaker-x
  6. 06

    注文を出荷に渡す

    支払い済みの注文はストリームに追記されます。倉庫システムは自分のペースでそれらを処理します。

    XADD orders * order 7781 sku sneaker-x customer 42
活用シーン

実際のシナリオ

スニーカーとグッズの限定販売

限定品は数秒で売り切れますが、1足たりとも過剰販売されません。

チケット販売

座席は購入手続き中の数分間確保され、購入者が離脱すると自動的に解放されます。

フードと食料品の配達

配達枠はカウンターで、顧客が予約するたびにアトミックに減算されます。

標準搭載

得られるもの

アトミックなカウンター

DECRとINCRは、競合なしに1ステップで在庫を変更します。

DECRINCRBY

期限切れになる確保

予約はTTL付きのキーです。

SETNXEX

ボット対策

正確な再試行時間を返す、顧客ごとの制限。

GCRA.LIMIT

注文の受け渡し

コンシューマーグループと確認応答を備えた、出荷用のストリーム。

XADDXREADGROUP
リファレンス:DECRSETGCRA.LIMITXADD

よくある質問

期限切れになった確保はどうやって在庫に戻りますか?

期限切れの確保はキースペース通知や定期的なスイープで検知でき、それによって在庫カウンターを再び加算します。

在庫を確保せずに確認できますか?

はい。GETは現在の数を返します。予約を行うのはDECRだけです。

複数の商品が入ったカートは?

MULTIとEXEC、またはファンクションを使って、複数のカウンターをまとめて減算します。

関連するユースケース

ご自身のワークロードで試してみましょう

HotKVはRedisプロトコルに対応しているため、既存のクライアントを向けるだけで、これらと同じコマンドを実行できます。