Magento voorraad synchronisatie on speed!

python-magento

Situatie

Elke ochtend publiceert het voorraadsysteem van een van onze klanten een bestand met daarin alle data van de producten die zij aanbieden. Een selectie daarvan bieden zij aan op hun site. Met deze selectie bedoelen we nog zo’n 30.000 producten, best veel!

We moeten na het publiceren van dit bestand de volledige catalogus updaten, het gaat hier om producten met een kleine voorraad dat veel veranderingen kent. Ook zijn bepaalde producten na verloop van tijd niet meer leverbaar en moeten daarom niet meer verkocht kunnen worden in de webshop.

Voorraad synchronisatie in Magento

De eerste versie van het voorraad synchronistatie script was volledig in php geschreven en gebruikte veel componenten van Magento. Bij mutaties van het voorraadbestand werd het script getriggerd en ging hij per product controleren of zijn voorraad geupdate moet worden en zonodig ge(de)activeerd moet worden.

Opzich werkt deze manier van synchroniseren prima, alleen bij 30.000 producten brengt de overhead die het ophalen van objecten zoals Product en Stock kent serieuze problemen met zich mee. Allereerst kost het ophalen van alle data per product relatief veel tijd, waardoor het totale synchronisatie proces bijna 1,5 uur kost. Daarbij komt ook nog dat php niet heel efficient met het geheugen omspringt waardoor er ook nog erg veel van de server wordt gevraagd.

Het grootste probleem die de verwerkingstijd met zich meebrengt is dat de beheerder van de webshop ongeduldig wordt omdat hij het gevoel heeft dat er helemaal niks gebeurd!

1,5 uur? Dat moet sneller!

Het is erg vervelend om elke keer als de beheerder van de webshop denkt dat de synchronisatie niet loopt, te moeten controleren of dit het geval is en uit te moeten leggen dat het nog eventjes duurt.

We kunnen dit op 2 manieren voorkomen:

  • We geven de beheerder feedback over het proces;
  • We zorgen dat het synchroniseren minder tijd in beslag neemt.

Omdat het geven van feedback van een shell script in de backend van Magento geen eenvoudige klus is, en optie 2 het daadwerkelijke probleem oplost kiezen we hiervoor.

I.p.v. van php hebben we het hele script herschreven in Python, een taaltje wat ons wel ligt ;-) , Na even puzzelen in de database van Magento weten waar hij deze gegevens opslaat namelijk in: cataloginventory_stock_item en cataloginventory_stock_status. Om deze records te benaderen moeten we de product_id hebben, de koppeling tussen product_id en de sku kan worden gevonden in catalog_product_entity. Alle sku -> product_id koppelingen slaan we op in het geheugen zodat we dat razendsnel kunnen benaderen.

We hebben door deze werkwijze minimale overhead waardoor het updaten van de voorraad behoorlijk sneller wordt, namelijk van 5400 seconden (1,5 uur) naar 24 seconden. Dit mag een behoorlijke verbetering genoemd worden!

De beheerder ziet daardoor vrijwel direct de nieuwe voorraad, waardoor een hoop onduidelijkheden m.b.t. het uitvoeren van de synchronisatie worden weggenomen.

Reacties

Helaas, het reactieformulier is op dit moment gesloten.