KerndatenE-Commerce

Flash Sales und Lagerbestand

Verkaufen Sie genau den Bestand, den Sie haben, wenn zehntausend Kunden in derselben Sekunde auf Kaufen klicken, und halten Sie die Bots fern.

Bestandsverringerung
Atomare
überverkaufte Einheiten
0
Reservierungen, die sich selbst lösen
10 Min.
Schritt 1 von 6
Den Bestand laden

500 Einheiten gehen in den Verkauf.

Beispielsitzungplaying
# Den Bestand laden
hotkv> SET stock:sneaker-x 500
OK

Ein animierter Durchlauf mit echten HotKV-Befehlen und Beispielantworten. Klicken Sie auf einen Schritt, um direkt dorthin zu springen. Befehle und Antworten bleiben auf Englisch, genau so, wie Sie sie in HotKV eingeben und sehen.

Das Problem

Bei einem Flash Sale ist die Bestandsdatenbank genau dann der Engpass, wenn es am meisten darauf ankommt. Prüfungen nach dem Muster Lesen-dann-Schreiben überverkaufen bei gleichzeitigen Zugriffen, abgebrochene Warenkörbe sperren Bestand für immer, und Bots kaufen den Bestand weg, bevor echte Kunden die Seite fertig geladen haben.

So löst HotKV es

Der Bestand liegt in einem Zähler, der atomar verringert wird, sodass gleichzeitige Käufer nie mehr nehmen können, als vorhanden ist. Jede Reservierung ist ein Key mit zehn Minuten Ablaufzeit, ein Rate Limit pro Kunde bremst die Bots, und bestätigte Bestellungen gehen in einen Stream, den das Fulfilment in seinem eigenen Tempo abarbeitet.

Schritt für Schritt

Was passiert, Befehl für Befehl

  1. 01

    Den Bestand laden

    500 Einheiten gehen in den Verkauf.

    SET stock:sneaker-x 500
  2. 02

    Die Bots in Schach halten

    Jeder Kunde darf es zweimal pro 10 Sekunden versuchen. Bots überschreiten das sofort.

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

    Eine Einheit nehmen

    DECR ist atomar. 10.000 gleichzeitige Klicks können nie mehr als 500 Einheiten nehmen.

    DECR stock:sneaker-x
  4. 04

    Zehn Minuten reservieren

    Die Reservierung läuft von selbst ab, wenn der Checkout abgebrochen wird, und ein Aufräumjob legt die Einheit zurück.

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

    Ausverkauft wird abgefangen

    Fällt DECR unter null, wird die Einheit zurückgegeben, und der Kunde sieht ausverkauft. Der Bestand ist nie lange negativ.

    INCR stock:sneaker-x
  6. 06

    Bestellungen ans Fulfilment übergeben

    Bezahlte Bestellungen werden an einen Stream angehängt. Das Lagersystem arbeitet sie in seinem eigenen Tempo ab.

    XADD orders * order 7781 sku sneaker-x customer 42
Wo es passt

Szenarien aus der Praxis

Sneaker- und Merchandise-Drops

Limitierte Editionen sind in Sekunden ausverkauft, ohne dass ein einziges Paar zu viel verkauft wird.

Ticketing

Plätze werden während des Checkouts einige Minuten reserviert und automatisch freigegeben, wenn der Käufer geht.

Essens- und Lebensmittellieferung

Lieferfenster sind Zähler, die atomar verringert werden, wenn Kunden sie buchen.

Integriert

Was Sie bekommen

Atomare Zähler

DECR und INCR ändern den Bestand in einem Schritt, ohne Race Condition.

DECRINCRBY

Ablaufende Reservierungen

Reservierungen sind Keys mit einer TTL.

SETNXEX

Bot-Schutz

Limits pro Kunde mit einer exakten Wartezeit.

GCRA.LIMIT

Übergabe von Bestellungen

Ein Stream für das Fulfilment, mit Consumer Groups und Bestätigungen.

XADDXREADGROUP

Häufige Fragen

Wie geben abgelaufene Reservierungen Bestand zurück?

Abgelaufene Reservierungen lassen sich über Keyspace Notifications oder einen periodischen Aufräumlauf erkennen, der den Bestandszähler wieder erhöht.

Kann ich den Bestand prüfen, ohne etwas zu nehmen?

Ja. GET liefert den aktuellen Stand. Nur DECR reserviert.

Was ist mit Warenkörben mit mehreren Artikeln?

Verwenden Sie MULTI und EXEC oder eine Funktion, um mehrere Zähler gemeinsam zu verringern.

Verwandte Anwendungsfälle

Probieren Sie es mit Ihrer eigenen Workload

HotKV spricht das Redis-Protokoll, sodass Sie einen bestehenden Client darauf richten und genau diese Befehle ausführen können.