Skip to content

Instantly share code, notes, and snippets.

@josephbima
Last active October 13, 2025 12:25
Show Gist options
  • Select an option

  • Save josephbima/0104a80c952369cecc312ed4e5bbd1b9 to your computer and use it in GitHub Desktop.

Select an option

Save josephbima/0104a80c952369cecc312ed4e5bbd1b9 to your computer and use it in GitHub Desktop.

Real-World Challenge: “Safe Cached Ticket Counter”


🧩 Konteks

Kamu membangun endpoint POST /buy untuk sistem ticketing. Jumlah tiket per event terbatas (misalnya 1,000 tiket). Service kamu berjalan di Kubernetes multi-pod, dengan Redis shared cache, dan database PostgreSQL sebagai sumber kebenaran.

Saat ribuan user menekan tombol Buy, kamu harus memastikan tidak ada oversell — walaupun permintaan datang bersamaan dari banyak pod.


🧱 Asumsi Lingkungan

  • DB PostgreSQL: menyimpan event_id, quota, dan sold.
  • Redis: menyimpan counter sementara (remaining_tickets:{eventId}).
  • Tidak boleh pakai Lua scripting.
  • API lain (admin) bisa menambah kuota di DB (harus tetap sinkron dengan cache).

🎯 Tugas

Implementasikan logika safe ticket decrement tanpa race condition. Buat pseudocode atau kode pendek untuk fungsi berikut:

function buyTicket(eventId, userId, quantity, idempotencyKey)

Fungsi ini harus menjamin:

  1. Tidak ada oversell, walaupun 1000 request datang bersamaan.
  2. Cache dan DB tidak boleh berbeda jauh — kalau cache kosong, harus bisa rebuild dari DB.
  3. Atomicity: tiap pembelian mengurangi stok secara aman dan konsisten.
  4. Idempotent: permintaan dengan idempotencyKey yang sama tidak menggandakan pembelian.

📦 Data Contoh

event_id quota sold
E123 1000 995

Redis (awal):

remaining_tickets:E123 = 5

Kandidat harus menjaga agar 6 user yang bersamaan beli 1 tiket tidak menyebabkan remaining < 0.

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