SCALABLE DATA PROCESSING MET RABBITMQ
HET PROJECT www.dekrachtvanmarktplaats.nl Voor autodealers die adverteren op marktplaats Inzichten in het aantal leads en views op geplaatste advertenties Historische informatie terug zien
DE OPDRACHT Opschalen van 2.000 dealers naar 10.000 dealers Verwerken van alle automotive leads van Marktplaats Hudige platform is end of life Focus op schaalbaarheid Applicatie opdelen in 2 componenten
WEB APPLICATIE Advertentie overzicht Actuele en historische statistieken inzien Performance van advertenties vergelijken tegen een benchmark Techniek UI (Angular) API (Zend expressive) Om de frontend zo licht mogeljik te maken en het dataverkeer naar de server te beperken hebben we gekozen om de frontend op te bouwen in AngularJS. API en UI losgekoppeld om ze individueel te kunnen schalen. UI load is nagenoeg niets (alleen 1x laden) API draait nu op 3 servers, maar er kan eenvoudig een server bijgezet worden.
CONSOLE APPLICATIE Afhandelen van alle leads Verwerken van statistieken voor alle dealers Veel data verwerken in korte tijd (data spikes) Er mogen geen leads verloren gaan door timeouts oid
DATA SPIKES Asynchroon Meerdere processen die parallel data verwerken Alleen 1 probleem … Asynchroon Meerdere processen die parallel data verwerken Asynchroon: bericht aannemen, opslaan zodat deze later verwerkt kan worden Parallel data verwerken (mutli threaded)
Randvoorwaarde voor het project Multi threading en async in PHP… yeah…
SUPERVISOR Process manager Kan meerdere instanties van een process starten Herstart scripts automatisch in geval van errors
LEAD VERWERKING Valideren van de lead signature Verrijken van de lead met gegevens uit de Marktplaats API Opslaan van de lead in de database Doorsturen van de lead naar API Partners Leads hebben een hash die berekent wodt aan de hand van de lead body en een secret Valideren van signature is een simpele operatie Communicatie van externe services kan langer duren Opsplitsen in losse processes die ieder een actie op zich nemen.
LEAD VERWERKING Valideren van de lead signature Verrijken van de lead met gegevens uit de Marktplaats API Opslaan van de lead in de database Doorsturen van de lead naar API Partners Kunnen echter nog niet individueel schalen…
MESSAGE BROKER Twee taken Berichten aannemen en in een queue zetten Het eerste bericht uit de queue terug geven als daarom gevraagd wordt. (FIFO) Door de message broker te gebruiken krijgen kunnen we de workers nu loskoppelen van elkaar en kunnen we voor acties die langer duren makkelijk meerdere workers gebruiken.
MESSAGE BROKER SELECTIE Criteria Moet kunnen draaien in een cluster Bestand zijn tegen grote hoeveelheden berichten Er mag geen data verloren gaan (persistent messages)
RABBITMQ VS KAFKA RABBITMQ Goede documentatie Ondersteund verschillende clients en protocollen Makkelijk te installeren en te configureren KAFKA Enterprise level Geschikt voor extreem veel berichten Focus op JAVA Kafka en RabbitMQ waren toentertijd de populairste brokers Gekozen voor RabbtMQ Verwerkingssnelheid was ruim voldoende Ondersteuning voor PHP Makkelijk op te zetten
RabbitMQ komt ook nog met een slicke interface…
Pas als de worker het ACK signaal stuurt beschouw Rabbit het bericht als verwerkt en wordt het verwijderd van de queue. Maar wat als er wat misgaat? De API van een externe partij is down (hopelijk tijdelijk), er zit een bug in de code of de database server geeft geen response?
ERROR HANDLING Het probleem is permanent (inconsistente data aanlevering, bug in de code) Het probleem is tijdelijk en gaat “vanzelf” over (externe API is overbelast) Permanente problemen worden weggeschreven naar een aparte queue zonder listener -> Failed queue Voor tijdelijke problemen gebruiken we een RabbitMQ plugin: “delayed message plugin”
Vertraging volgens Fibonacci
PUNT. 088 648 04 01