Skip to content

Instantly share code, notes, and snippets.

@josephbima
Created October 8, 2025 01:29
Show Gist options
  • Select an option

  • Save josephbima/1619f741352e9ff0213c6789d2f7dde3 to your computer and use it in GitHub Desktop.

Select an option

Save josephbima/1619f741352e9ff0213c6789d2f7dde3 to your computer and use it in GitHub Desktop.

πŸ’» Coding Challenge β€” POST /buy (Moflip Ticketing)

🎯 Tujuan

Implement POST /buy yang mengunci dan mengurangi kuantitas tiket secara aman di lingkungan multi-pod tanpa oversell.


🧱 Asumsi Lingkungan

  • 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.

🧩 Kontrak API

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.


πŸ—ƒοΈ Struktur Key Redis (wajib)

  • 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment