Hoe voorkom je dat twee mensen het laatste ticket kopen?
Share

In this article
- 01Waarom leidt een lees-then-schrijf op het aantal tickets tot overselling?
- 02Waarom een pessimistische rijvergrendeling gebruiken voor de laatste tickets?
- 03Hoe voorkomt een Redis-reservering dat verlaten checkouts de voorraad blokkeren?
- 04Wat gebeurt er als de betaalwebhook twee keer binnenkomt?
- 05Houdt dit stand onder belasting?
Verlaag het aantal tickets binnen een korte database-transactie die een pessimistische rijvergrendeling vasthoudt, en reserveer elk ticket in Redis met een time-to-live (TTL). De tweede koper wacht enkele milliseconden achter de eerste bij het schrijven, en ziet dan dat het uitverkocht is. Verlaten checkouts geven hun reservering automatisch vrij wanneer de TTL verloopt.
Waarom leidt een lees-then-schrijf op het aantal tickets tot overselling?
Twee verzoeken kunnen dezelfde resterende hoeveelheid van één lezen, beide slagen voor de controle en schrijven vervolgens een verkoop. Het aantal was correct bij het lezen en verouderd bij het schrijven, waardoor één ticket twee keer wordt verkocht. Elke lees-then-schrijf op gedeelde voorraad heeft deze raceconditie tenzij het schrijven atomair of vergrendeld wordt uitgevoerd.
Een eenvoudige optimistische retry lost het correctheidsprobleem op, maar veroorzaakt veel herhalingen zodra de laatste tickets van een populair evenement door een piek aan checkouts worden geraakt: elke verliezende koper moet de hele checkout opnieuw proberen, niet alleen het schrijven.
Waarom een pessimistische rijvergrendeling gebruiken voor de laatste tickets?
Een pessimistische vergrendeling zorgt ervoor dat de tweede schrijver kort wacht in plaats van te falen en blind te herhalen. Voor één populaire rij waar veel kopers tegelijk om strijden, zijn een paar milliseconden wachten goedkoper dan het herhalen van de hele checkout. De vergrendeling wordt alleen vastgehouden voor de korte transactie die het aantal tickets verlaagt.
Hoe voorkomt een Redis-reservering dat verlaten checkouts de voorraad blokkeren?
Wanneer een koper begint met afrekenen, reserveer het ticket dan in Redis met een TTL. Als ze betalen, wordt de reservering omgezet in een verkoop. Als ze weggaan, verloopt de sleutel en keert het ticket automatisch terug naar de voorraad. Niemand kan een ticket vasthouden door een checkout-tab te openen en weg te lopen.
Wat gebeurt er als de betaalwebhook twee keer binnenkomt?
Er gebeurt niets extra. De webhook-handler is idempotent, gebaseerd op order-ID, en heeft alleen als taak een payment-confirmed event naar RabbitMQ te publiceren. Een herhaalde levering vindt de order al verwerkt, dus een ticket wordt nooit twee keer uitgegeven. Een downstream consumer genereert het ticket en stuurt de bevestiging.
Hetzelfde patroon wordt stap voor stap behandeld in de notitie over idempotente webhooks.
Houdt dit stand onder belasting?
In tests op FindYourVibe bleef de checkout correct bij meer dan 300 gelijktijdige kopers bij een enkele evenementrelease, zonder dat er tickets werden oversold. De ontwerpkeuzes die dit mogelijk maakten zijn de rijvergrendeling op de laatste tickets, de Redis-reservering met TTL en de idempotente webhook die een wachtrij voedt.
Pessimistische rijvergrendeling op de laatste tickets van een evenement
Redis-reservering met TTL, zodat er geen overselling plaatsvindt
RabbitMQ ontkoppelt ticketuitgifte van de webhook-respons
Idempotente betaalwebhook gebaseerd op order-ID
Oorspronkelijk gepubliceerd op sakshamjain.codes/blog/stop-two-people-buying-the-last-ticket. Heb je dit nodig? Bekijk mijn diensten op NexoRush of stuur me een bericht.