Eseguire più processi paralleli contemporaneamente in PHP? Si può fare!

Eseguire più processi paralleli contemporaneamente in PHP? Si può fare!

Scenario: azienda multinazionale, da 80 milioni di euro di fatturato l’anno con diverse sedi in Italia e nel mondo, concorda con un esiguo numero di clienti, ma che messi insieme rappresentano la fetta più grossa del fatturato, di implementare la Supply Chain Collaboration. In altre parole: automatizzare tutte le fasi della gestione degli approvvigionamenti, dalle richieste d’offerta alle fatture, passando per gli ordini di acquisto, le conferme, gli allegati, gli avvisi di spedizione e le bolle.

Parola d’ordine: time saving for all!

“La semplicità è la forma della vera grandezza”, quindi, la soluzione più semplice per noi è stata riadattare secondo le nuove esigenze il middleware basato su Symfony2 che funge da “scambiatore di dati” (come un business logic layer) tra l’ERP aziendale e i vari vendor che lo interrogano. Ne avevo descritto il funzionamento proprio qui. Di fatto un vendor in più che si interfaccia con la piattaforma in questione non avrebbe fatto certo la differenza. Questo pensavamo. Salvo poi, a mano a mano che procedeva lo sviluppo, dover scoprire che era necessario portare a termine molti task praticamente in parallelo. Ricevere l’ordine del cliente in xml, scomporlo nodo per nodo, interrogare l’ERP per capire in quale stabilimento del gruppo l’ordine deve essere inviato e processato, ricomporre l’xml in formato utile (se gli xml di contatto tra i due gestionali fossero stati uguali nella struttura era troppo semplice!) e invio. Process e spedizione della conferma dell’ordine al mittente. Come fare questo in poche frazioni di secondo senza “rompere la internet” [citazione: vedi Kim Kardashian]?

Nel nostro caso la risposta è stata Gearman, un distributed application framework che permette di gestire processi su differenti macchine anche in modo parallelo, oppure in modo asincrono, in base alle esigenze. Per darvi un’idea di cosa riesce a fare ‘sto coso basta solo nominare chi lo utilizza per garantire la scalabilità delle performance: Yahoo, Craig’s List, Tumblr, Yelp, Etsy.

Non è stata comunque una soluzione a buon mercato: nessuno di noi lo aveva mai utilizzato e quindi i primi tentativi sono andati tutti storti, quindi armatevi di tanta pazienza.

Installare il job server:
apt-get install gearman-job-server libgearman-dev

Poi installare l’estensione di PHP:
apt-get install php5-dev php-pear
pecl install gearman

E infine includere in Symfony il bundle:
https://github.com/ulabox/GearmanBundle

Il passo sucessivo è stato creare i Worker necessari per elaborare i task e un Client che raccogliesse gli esiti dei vari Job.

Fatto questo, rimaneva solo da attivare MONIT per tenere sotto controllo i vari Worker in modo che fossero costantemente in esecuzione:

check process gearman.worker.dapi.middleweare
matching "AcmeDemoBundle.AcmeWorker"
start "/usr/local/bin/php /var/www/public_html/app/console gearman:worker:execute --worker=AcmeDemoBundle:AcmeWorker"
uid www-data gid www-data
stop "/usr/bin/pkill --full AcmeDemoBundle.AcmeWorker"

Rispondi