Implement POST /buy yang mengunci dan mengurangi kuantitas tiket secara aman di lingkungan multi-pod tanpa oversell.
- 1,000 Tiket yang dijual
- Layanan berjalan di Kubernetes (banyak pod).
- Ada Redis bersama (cluster/sentinel, detail tidak penting), tanpa Lua.
- Database (Postgres) tidak perlu disentuh untuk challenge ini.
- Fokus: konsistensi stok dan ketahanan di concurrent access.
Endpoint: POST /buy
Body:
{
"eventId": "E123",
"userId": "U456",
"quantity": 3,
"idempotencyKey": "e123-u456-20251007-abc123"
}
Respons (contoh sukses):
{
"ok": true,
"status": "CONFIRMED",
"eventId": "E123",
"userId": "U456",
"quantity": 3,
"remaining": 997
}
Respons (contoh gagal):
{
"ok": false,
"status": "FAILED",
"code": "OUT_OF_STOCK",
"message": "Not enough inventory",
"available": 2
}
idempotencyKey wajib (unik per percobaan order dari klien).
Jika request yang sama dikirim ulang (network retry), hasilnya harus konsisten dan tidak mengurangi stok dua kali.
-
inv:{eventId}β integer stok tersedia.contoh:
inv:E123 = 1000 -
order:{idempotencyKey}β hash status idemp.field minimal:
statusβ {PENDING,CONFIRMED,FAILED}eventId,userId,qty,reason(opsional)
-
lock:event:{eventId}β string owner lock (mis.userId:idemp) dengan TTL 10 detik.
Boleh menambah key metrik (mis. sold:{eventId}) tapi bukan syarat.