Flash Sale Inventory Stock Reservation

30:00

1. Studi Kasus

Saat event Flash Sale dengan trafik tinggi, platform e-commerce menggunakan reservasi stok sementara (TTL = 5 menit). Ketika pengguna memasukkan produk ke keranjang, stok direservasi secara sementara. Jika checkout tidak diselesaikan dalam 5 menit, masa reservasi habis dan stok otomatis dikembalikan ke inventori publik.

POST /orders/reserve

2. Spesifikasi Input & Output

Request Body:

{
  "userId": "USER_101",
  "itemId": "ITEM_100",
  "quantity": 2
}

Response Berhasil (HTTP 201):

{
  "message": "Stock reserved successfully",
  "reservationId": "RES_1721839000000",
  "expiresInSeconds": 300
}

3. Data Awal In-Memory

const inventory = [
  { itemId: "ITEM_100", totalStock: 10, reservedStock: 0 }
];

const reservations = [];

4. Requirement & Aturan Validasi

  1. Validasi Body: userId, itemId, dan quantity ($> 0$) wajib diisi → HTTP 400 jika tidak valid.
  2. Cek Produk: Jika itemId tidak ada di inventory → HTTP 404 "Item not found".
  3. Hitung Stok Tersedia: availableStock = totalStock - reservedStock. Jika quantity > availableStockHTTP 400 "Insufficient available inventory".
  4. Catat Reservasi: Buat objek { reservationId: "RES_" + Date.now(), userId, itemId, quantity, expiresAt: Date.now() + 300000, status: "ACTIVE" }
  5. Update State: Tambahkan inventory.reservedStock += quantity

5. Pertanyaan Bonus Konseptual 💡

Pelepasan Reservasi Kadaluarsa di Production

Di komentar kode solusi Anda, jelaskan cara otomatis melepas stok reservasi yang kadaluarsa menggunakan:

  • Redis Keyspace Notifications (notify-keyspace-events KEA → dengarkan event expired)
  • Delayed Job Queue (BullMQ dengan delayed job 5 menit)
solution.js
Loading...
Local Test Console