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.
- DB PostgreSQL: menyimpan
event_id,quota, dansold. - 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).
Implementasikan logika safe ticket decrement tanpa race condition. Buat pseudocode atau kode pendek untuk fungsi berikut:
function buyTicket(eventId, userId, quantity, idempotencyKey)
- Tidak ada oversell, walaupun 1000 request datang bersamaan.
- Cache dan DB tidak boleh berbeda jauh — kalau cache kosong, harus bisa rebuild dari DB.
- Atomicity: tiap pembelian mengurangi stok secara aman dan konsisten.
- Idempotent: permintaan dengan
idempotencyKeyyang sama tidak menggandakan pembelian.
| 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.