API untuk booking event menggunakan springboot. Fitur:
- Searching event
- Book event
- Using booking token, untuk prevent double booking atau idempotent feature
- Validasi dalam sql writing, atomic untuk mencegah race condition
Feature yang digunakan:
- Untuk race condition, atomic conditional update. Pada saat membaca stock dan menulis stock ada delay, ada kemungkinan untuk double booking. Maka digunakan conditional check saat mengurangi jumlah tiket yang dibooking dan claim token booking.
UPDATE ms_event SET ticket_available = ticket_available - :qty
WHERE event_id = :id AND ticket_available >= :qtyUPDATE BookingToken t
SET t.status = 'USED', t.updatedAt = :now
WHERE t.id = :tokenId
AND t.user.id = :userId
AND t.status = 'ISSUED'- Untuk multiple book, idempotent using token. Submit dengan token yang sama akan di-response booking yang asli (replay).
- Transaction untuk pengurangan tiket, sehingga jika tiket habis maka rollback issued token.
- Rate limiter solution, menggunakan bucket4j intervally refill pada issue booking token.
- Java 21, Springboot 4.x (Web, Hibernate JPA)
- Maven (Wrapper)
- Bucket4j
- Testcontainer, Junit
- PostgreSql
| Requirement | Version |
|---|---|
| JDK | 21+ |
| Docker | any recent |
Semua test ada di src/test
./mvnw test
(windows) ./mvnw.cmd test
- Run Database
docker compose up -d
- Start Application
./mvnw spring-boot:run
(windows).\mvnw.cmd spring-boot:run
