SlideShare une entreprise Scribd logo
1  sur  36
Télécharger pour lire hors ligne
Synchroniser ses applications
(plus) simplement
depuis le PHP Tour 2017, 3 ans ont passé
Grégory Planchat, Kiboko SAS
Résumé de
l’épisode
précédent
PHP Tour 2017, Nantes
● Environnements IT de plus en
plus hétéroclites
● Utilisation d’akeneo/batch sur
des grands volumes
● Difficile équilibre entre RAM,
I/O et CPU pour gagner en
performances
● Écosystème PHP assez pauvre
sur le sujet des flux
Rappels akeneo/batch
Lire
Lit un flux
Lit un flux, élément par
élément, depuis :
● fichiers
● entités Doctrine
● Message Queues
● API
● ...
Transformer
Transforme l’élément
Transforme les éléments
lus unitairement pour les
faire correspondre au
format de destination.
Utilise les normaliseurs
Symfony ou des
mappeurs de données
Écrire
Enregistre les éléments
Enregistre par lot les
éléments vers :
● fichiers
● entités Doctrine
● Message Queues
● API
● ...
Principales problématiques
Lecture
● Fuites mémoire de
l’UoW Doctrine
● Difficultés à traiter
des sources de
données mixtes
Processeur
● Lookups unitaires
● Pas de scission des
lignes en plusieurs
● Pas de fusion des
lignes
Ecriture
● Fuites mémoire de
l’UoW Doctrine
● Taille d’un batch
dans la RAM
Job
● Traitements “doublons”
● Pas de scission des lignes en plusieurs lignes
Et maintenant ?
L’histoire de Louis, le développeur back-end
Louis vient de mettre en production une marketplace pour les 70 magasins d’une enseigne de jardinerie.
L’ensemble du catalogue cumule plus de 150.000 références de produits.
Chaque magasin veut pouvoir piocher parmi ce catalogue une liste de référence, y appliquer ses prix et
ses stocks pour qu’ils soient visibles sur leur section de la marketplace.
L’histoire de Louis, le développeur back-end
Louis ne dispose pas des outils qui lui permettent de faire des mises à jour quotidiennes. Ses stocks,
prix et contenus des catalogues doivent être mis à jour. Il va devoir les développer.
Pour cela, il doit faire interagir les ERP des 70 magasins avec la Marketplace.
Seulement, les outils dont il dispose ne sont pas adaptés pour traiter des millions d’enregistrements.
Changeons de méthode
La Pipeline
La Pipeline
Louis imagine une manière différente de résoudre son problème : il va traiter son besoin ligne à ligne et
permettre d’effectuer autant d’opérations de transformation qu’il sera nécessaire.
Louis conçoit un prototype.
Changeons de méthode
Extraction
Extraction des
données depuis la
source primaire
Transformation
Transformation des
données en un format
exploitable
Recherche et
fusion
Fusion des données
de la source principale
avec des données de
sources secondaires
...
Le nombre d’opérations de
transformation et de recherche
n’ont pas de limite
Chargement
Chargement des
données consolidées
dans le système tiers
La Pipeline
Cette pipeline intègre 3 grandes familles de traitements :
1. l’extraction
2. la transformation
3. le chargement
Louis utilise le patron de conception ETL
Changeons de méthode
La Pipeline
Live coding
git clone git@github.com:php-etl/sandbox.git
git checkout step/1-extract-load
run pipeline:customers:run data/10000-customers.csv php://stdout
● Au lieu de lire les lignes par lot, nous allons lire les lignes une à une et les traiter comme un flux
continu.
● À chaque instant, une seule ligne est placée en mémoire, ce qui permet de traiter le cas de
grosses structures de données
● Nous avons besoin de formats source capables d’être lus ligne à ligne (CSV, LDJSON, SQL, etc..)
Changeons de méthode
Le Mapping des
données
Le Mapping des données
Louis a réussi à créer ses premières pipelines, il peut lire les données provenant de ses ERP et de son
PIM et peut maintenant facilement les agréger.
Il écrit beaucoup de fonctions de mapping, elles sont efficaces et ses synchronisations sont rapides.
Changeons de méthode
Le Mapping des données
Live coding
git clone git@github.com:php-etl/sandbox.git
git checkout step/2-transformation
run pipeline:products:run data/10000-products.csv php://stdout
● Le mapping consiste à transformer une donnée d’un format initial vers un format de destination.
● Il peut être effectué sur des données de tous types, il peut permettre par exemple d’aplatir des
tableaux à plusieurs dimensions, ou placer les données dans des structures d’objets.
Changeons de méthode
La génération de
code spaghetti
La génération de code spaghetti
Louis a réussi à effectuer son mapping de données. Au fur et à mesure de l’avancement du projet ses
fonctions de mapping deviennent de plus en plus difficiles à relire et à maintenir.
Il a de plus en plus l’impression d’écrire du code spaghetti, il réfléchit à un moyen de simplifier la
maintenance de son code, sans pénaliser les performances qu’il a durement acquises.
Changeons de méthode
La génération de code spaghetti
Louis avait essayé d’utiliser la composition et la configuration pour gérer son mapping, mais les
performances n’étaient pas satisfaisantes du tout.
Et vient une idée à Louis : et si on créait un compilateur de code qui permettrait d’avoir le meilleur des
deux mondes : configurer le mapping et disposer d’un code spaghetti très performant que l’on n’aurait
pas à maintenir ?
Changeons de méthode
La génération de code spaghetti
Louis trouve deux pistes très intéressantes :
● nikic/php-parser
● symfony/expression-language
Avec ces deux paquets il aura la souplesse dont il a besoin pour générer du code PHP et avoir un
langage procédural simple similaire à celui d’Excel.
Changeons de méthode
La génération de code spaghetti
Live coding
git clone git@github.com:php-etl/sandbox.git
git checkout step/3-fast-map
run fast-map:compile
run pipeline:products:run data/10000-products.csv php://stdout
● Le code spaghetti n’est un problème que si on n’arrive pas à le faire évoluer
● La transformation d’une configuration en un code PHP brut permet d’éviter des actions parasites.
Ces actions n’auront pas de plus-value pendant l’exécution. Elles pourraient ralentir la
transformation de données si elle est exécutée des milliers de fois
Changeons de méthode
La recherche, la
fusion et la scission
La recherche, la fusion et la scission
Maintenant que Louis peut synchroniser deux systèmes ensemble, il a une nouvelle difficulté : comment
faire pour lire dans plus d’une source de données ?
De la même manière : comment extraire une liste d’images d’après une liste de produits quand un produit
peut avoir un nombre indéterminé d’images ?
Changeons de méthode
La recherche, la fusion et la scission
Pour se libérer des contraintes des sources multiples et du lookup unitaire, Louis divise ses Pipelines en
deux parties.
La partie amont enregistre d’abord les données dans une base de données temporaire. Puis la partie aval
extrait le contenu de la base de données vers le système de destination.
Grâce aux Jobs de akeneo/batch, Louis peut séquencer l’exécution de ses pipelines en 4 étapes.
Changeons de méthode
PIM
WMS
ERP
Système
tiers
2
1
3
4
La recherche, la fusion et la scission
La recherche de données complémentaires dans un stockage secondaire peut permettre d’enrichir la
source principale de données.
Par exemple, si ma source principale de données produits est mon PIM, les sources secondaires seront
l’ERP pour les prix et le DAM pour les images.
Louis pourra implémenter une étape de transformation qu’il appellera Lookup pour gérer ce besoin.
Changeons de méthode
La recherche, la fusion et la scission
La fusion est l’opération de regrouper plusieurs lignes de la source en une seule ligne.
Par exemple, regrouper toutes les lignes d’une commande lorsque l’on reçoit la liste des produits
commandés.
Louis pourra implémenter une étape de transformation qu’il appellera Merge pour gérer ce besoin.
Changeons de méthode
La recherche, la fusion et la scission
La scission est au contraire l’opération de séparation en plusieurs lignes de la source initialement sur
une seule ligne.
Par exemple, à partir d’une liste de produits avec leurs images, en extraire la liste des images seules.
Louis pourra implémenter une étape de transformation qu’il appellera Fork pour gérer ce besoin.
Changeons de méthode
Problématiques résolues
Lecture
● Fuites mémoire de
l’UoW Doctrine
● Difficultés à traiter
des sources de
données mixtes
Processeur
● Lookups unitaires
● Pas de scission des
lignes en plusieurs
● Pas de fusion des
lignes
Ecriture
● Fuites mémoire de
l’UoW Doctrine
● Taille d’un batch
dans la RAM
Job
● Traitements “doublons”
● Pas de scission des lignes en plusieurs lignes
Les pièges
Utilisation de la RAM
Les pièges
L’usage de la mémoire vive peut être un problème lorsque l’on traite un grand nombre de lignes de
données.
Par exemple, les fonctions json_decode(), json_encode(), file() et les classes de
SimpleXML et DOM vont placer l’ensemble de la source (fichier) en mémoire vive.
De la même manière, l’utilisation des tableaux en tant que liste de lignes provoquera une
augmentation de la consommation de mémoire, en plus de provoquer des ralentissements à
chaque redimensionnement du tableau.
Fuites mémoire de l’UnitOfWork de Doctrine
Les pièges
Doctrine utilise de manière interne le pattern Unit of Work pour gérer l’état des entités que l’ORM a
sous sa responsabilité.
Bien que ce pattern soit très efficace sur des processus courts, comme l’affichage de pages, il
peut avoir de lourdes conséquences s’il est mal maîtrisé dans des processus longs ou qui
traiteront de grands volumes de données.
L’idéal serait de se passer de l’ORM et utiliser des requêtes SQL préparées quand c’est possible.
Quand ce n’est pas possible, il faut pouvoir traiter par lots et appeler les méthodes flush() et
clear() de l’EntityManager à la suite de l’enregistrement de chaque lot.
Projets Open-source
Projets Open-Source
L’ensemble des projets sont disponibles sur Github :
● Contrats : https://github.com/php-etl/contracts
● Pipeline : https://github.com/php-etl/pipeline
● Bucket : https://github.com/php-etl/bucket
● Mappers compilés : https://github.com/php-etl/fast-map
● Exemples dans cette présentation : https://github.com/php-etl/sandbox
Questions ?
Notez, commentez
https://joind.in/event/afup-day-2020-nantes/synchroniser-ses-applic
ations-facilement-3-ans-ont-passe
Merci
Crédits illustrations : Freepik Stories
Code source sur https://github.com/php-etl/sandbox

Contenu connexe

Tendances

Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+ekino
 
Au coeur du framework .net 4.5.1
Au coeur du framework .net 4.5.1Au coeur du framework .net 4.5.1
Au coeur du framework .net 4.5.1Cellenza
 
Php forum 2017 - Maisons du Monde
Php forum 2017 - Maisons du MondePhp forum 2017 - Maisons du Monde
Php forum 2017 - Maisons du Mondemarchugon
 
Pmb Bug 2007 11 06 Danny
Pmb Bug 2007 11 06 DannyPmb Bug 2007 11 06 Danny
Pmb Bug 2007 11 06 DannyPMB-BUG
 
LoadTime & SEO - Erlé Alberton
LoadTime & SEO - Erlé AlbertonLoadTime & SEO - Erlé Alberton
LoadTime & SEO - Erlé AlbertonWeLoveSEO
 
Performance au quotidien dans un environnement symfony
Performance au quotidien dans un environnement symfonyPerformance au quotidien dans un environnement symfony
Performance au quotidien dans un environnement symfonyXavier Leune
 
Introduction à eZ Publish Platform 5.3
Introduction à eZ Publish Platform 5.3 Introduction à eZ Publish Platform 5.3
Introduction à eZ Publish Platform 5.3 Roland Benedetti
 
Quid de vos applications symfony 1
Quid de vos applications symfony 1Quid de vos applications symfony 1
Quid de vos applications symfony 1marchugon
 
Bien qu'en ligne votre site web n'est probablement pas en production
Bien qu'en ligne votre site web n'est probablement pas en productionBien qu'en ligne votre site web n'est probablement pas en production
Bien qu'en ligne votre site web n'est probablement pas en productionMarc Boivin
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBruno Bonnin
 
Frameworks : A history of violence
Frameworks : A history of violenceFrameworks : A history of violence
Frameworks : A history of violenceFrancois Zaninotto
 
Industrialisation des environnements de dev avec Puppet et Amazon (mais en fa...
Industrialisation des environnements de dev avec Puppet et Amazon (mais en fa...Industrialisation des environnements de dev avec Puppet et Amazon (mais en fa...
Industrialisation des environnements de dev avec Puppet et Amazon (mais en fa...Nicolas Silberman
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP NextSQLI
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Julien Jakubowski
 
eZ Publish Platform 5.2 - Webinaire d'introduction
eZ Publish Platform 5.2 - Webinaire d'introductioneZ Publish Platform 5.2 - Webinaire d'introduction
eZ Publish Platform 5.2 - Webinaire d'introductionRoland Benedetti
 
wallabag, comment on a migré vers symfony3
wallabag, comment on a migré vers symfony3wallabag, comment on a migré vers symfony3
wallabag, comment on a migré vers symfony3Nicolas Lœuillet
 
Real-Time applications avec la spécification Java (JSR 356) et le protocole W...
Real-Time applications avec la spécification Java (JSR 356) et le protocole W...Real-Time applications avec la spécification Java (JSR 356) et le protocole W...
Real-Time applications avec la spécification Java (JSR 356) et le protocole W...Ouadie LAHDIOUI
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another frameworkLAHAXE Arnaud
 

Tendances (20)

Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+
 
Au coeur du framework .net 4.5.1
Au coeur du framework .net 4.5.1Au coeur du framework .net 4.5.1
Au coeur du framework .net 4.5.1
 
Php forum 2017 - Maisons du Monde
Php forum 2017 - Maisons du MondePhp forum 2017 - Maisons du Monde
Php forum 2017 - Maisons du Monde
 
Pmb Bug 2007 11 06 Danny
Pmb Bug 2007 11 06 DannyPmb Bug 2007 11 06 Danny
Pmb Bug 2007 11 06 Danny
 
LoadTime & SEO - Erlé Alberton
LoadTime & SEO - Erlé AlbertonLoadTime & SEO - Erlé Alberton
LoadTime & SEO - Erlé Alberton
 
Performance au quotidien dans un environnement symfony
Performance au quotidien dans un environnement symfonyPerformance au quotidien dans un environnement symfony
Performance au quotidien dans un environnement symfony
 
Introduction à eZ Publish Platform 5.3
Introduction à eZ Publish Platform 5.3 Introduction à eZ Publish Platform 5.3
Introduction à eZ Publish Platform 5.3
 
Quid de vos applications symfony 1
Quid de vos applications symfony 1Quid de vos applications symfony 1
Quid de vos applications symfony 1
 
Bien qu'en ligne votre site web n'est probablement pas en production
Bien qu'en ligne votre site web n'est probablement pas en productionBien qu'en ligne votre site web n'est probablement pas en production
Bien qu'en ligne votre site web n'est probablement pas en production
 
Presentation
PresentationPresentation
Presentation
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache Zeppelin
 
Frameworks : A history of violence
Frameworks : A history of violenceFrameworks : A history of violence
Frameworks : A history of violence
 
Industrialisation des environnements de dev avec Puppet et Amazon (mais en fa...
Industrialisation des environnements de dev avec Puppet et Amazon (mais en fa...Industrialisation des environnements de dev avec Puppet et Amazon (mais en fa...
Industrialisation des environnements de dev avec Puppet et Amazon (mais en fa...
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
 
eZ Publish Platform 5.2 - Webinaire d'introduction
eZ Publish Platform 5.2 - Webinaire d'introductioneZ Publish Platform 5.2 - Webinaire d'introduction
eZ Publish Platform 5.2 - Webinaire d'introduction
 
wallabag, comment on a migré vers symfony3
wallabag, comment on a migré vers symfony3wallabag, comment on a migré vers symfony3
wallabag, comment on a migré vers symfony3
 
Real-Time applications avec la spécification Java (JSR 356) et le protocole W...
Real-Time applications avec la spécification Java (JSR 356) et le protocole W...Real-Time applications avec la spécification Java (JSR 356) et le protocole W...
Real-Time applications avec la spécification Java (JSR 356) et le protocole W...
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another framework
 

Similaire à Synchroniser ses applications (plus) simplement

Big Data ou comment retrouver une aiguille dans une botte de foin
Big Data ou comment retrouver une aiguille dans une botte de foinBig Data ou comment retrouver une aiguille dans une botte de foin
Big Data ou comment retrouver une aiguille dans une botte de foinPALO IT
 
Présentation Ecreall - Mickaël Launay
Présentation Ecreall - Mickaël LaunayPrésentation Ecreall - Mickaël Launay
Présentation Ecreall - Mickaël LaunayTechnocite
 
Les bases BI sont-elles différentes?
Les bases BI sont-elles différentes?Les bases BI sont-elles différentes?
Les bases BI sont-elles différentes?Franck Pachot
 
Des poneys à Liberation.fr
Des poneys à Liberation.frDes poneys à Liberation.fr
Des poneys à Liberation.frliberation_dev
 
L'agenda d'OBM 2.4, cas d'utilisations avancés
L'agenda d'OBM 2.4, cas d'utilisations avancés L'agenda d'OBM 2.4, cas d'utilisations avancés
L'agenda d'OBM 2.4, cas d'utilisations avancés LINAGORA
 
Python et son intégration avec Odoo
Python et son intégration avec OdooPython et son intégration avec Odoo
Python et son intégration avec OdooHassan WAHSISS
 
Construire un data lake managé - GDG Paris - Juin 2019
Construire un data lake managé - GDG Paris - Juin 2019Construire un data lake managé - GDG Paris - Juin 2019
Construire un data lake managé - GDG Paris - Juin 2019Jean-Baptiste Claramonte
 
Plugin PMB/SPIP Risom Pour Abf Auvergne 24 Avril 2009
Plugin PMB/SPIP Risom Pour Abf Auvergne 24 Avril 2009Plugin PMB/SPIP Risom Pour Abf Auvergne 24 Avril 2009
Plugin PMB/SPIP Risom Pour Abf Auvergne 24 Avril 2009Renaud AIOUTZ
 
Lepton : Description succincte
Lepton : Description succincteLepton : Description succincte
Lepton : Description succincteO10ée
 
ASP.NET MVC, Web API & KnockoutJS
ASP.NET MVC, Web API & KnockoutJSASP.NET MVC, Web API & KnockoutJS
ASP.NET MVC, Web API & KnockoutJSRenaud Dumont
 
Réussir son projet Drupal
Réussir son projet DrupalRéussir son projet Drupal
Réussir son projet DrupalAdyax
 
Deep Dive Performance , le In-Memory dans SQL Server
Deep Dive Performance , le In-Memory dans SQL ServerDeep Dive Performance , le In-Memory dans SQL Server
Deep Dive Performance , le In-Memory dans SQL ServerMicrosoft
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement webHouda TOUKABRI
 
Performance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPerformance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPrestaShop
 
Kiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internetKiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internetDevclic
 
Nettoyer et transformer ses données avec Openrefine : partie 1
Nettoyer et transformer ses données avec Openrefine : partie 1Nettoyer et transformer ses données avec Openrefine : partie 1
Nettoyer et transformer ses données avec Openrefine : partie 1Mathieu Saby
 
Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google CloudPierre Coste
 

Similaire à Synchroniser ses applications (plus) simplement (20)

Big Data ou comment retrouver une aiguille dans une botte de foin
Big Data ou comment retrouver une aiguille dans une botte de foinBig Data ou comment retrouver une aiguille dans une botte de foin
Big Data ou comment retrouver une aiguille dans une botte de foin
 
Présentation Ecreall - Mickaël Launay
Présentation Ecreall - Mickaël LaunayPrésentation Ecreall - Mickaël Launay
Présentation Ecreall - Mickaël Launay
 
Les bases BI sont-elles différentes?
Les bases BI sont-elles différentes?Les bases BI sont-elles différentes?
Les bases BI sont-elles différentes?
 
JasperReport
JasperReportJasperReport
JasperReport
 
Chapter1
Chapter1Chapter1
Chapter1
 
Des poneys à Liberation.fr
Des poneys à Liberation.frDes poneys à Liberation.fr
Des poneys à Liberation.fr
 
L'agenda d'OBM 2.4, cas d'utilisations avancés
L'agenda d'OBM 2.4, cas d'utilisations avancés L'agenda d'OBM 2.4, cas d'utilisations avancés
L'agenda d'OBM 2.4, cas d'utilisations avancés
 
Python et son intégration avec Odoo
Python et son intégration avec OdooPython et son intégration avec Odoo
Python et son intégration avec Odoo
 
Construire un data lake managé - GDG Paris - Juin 2019
Construire un data lake managé - GDG Paris - Juin 2019Construire un data lake managé - GDG Paris - Juin 2019
Construire un data lake managé - GDG Paris - Juin 2019
 
Plugin PMB/SPIP Risom Pour Abf Auvergne 24 Avril 2009
Plugin PMB/SPIP Risom Pour Abf Auvergne 24 Avril 2009Plugin PMB/SPIP Risom Pour Abf Auvergne 24 Avril 2009
Plugin PMB/SPIP Risom Pour Abf Auvergne 24 Avril 2009
 
Lepton : Description succincte
Lepton : Description succincteLepton : Description succincte
Lepton : Description succincte
 
43_pps.pdf
43_pps.pdf43_pps.pdf
43_pps.pdf
 
ASP.NET MVC, Web API & KnockoutJS
ASP.NET MVC, Web API & KnockoutJSASP.NET MVC, Web API & KnockoutJS
ASP.NET MVC, Web API & KnockoutJS
 
Réussir son projet Drupal
Réussir son projet DrupalRéussir son projet Drupal
Réussir son projet Drupal
 
Deep Dive Performance , le In-Memory dans SQL Server
Deep Dive Performance , le In-Memory dans SQL ServerDeep Dive Performance , le In-Memory dans SQL Server
Deep Dive Performance , le In-Memory dans SQL Server
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement web
 
Performance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPerformance et optimisation de PrestaShop
Performance et optimisation de PrestaShop
 
Kiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internetKiwiparty 2011 - Optimisation des sites internet
Kiwiparty 2011 - Optimisation des sites internet
 
Nettoyer et transformer ses données avec Openrefine : partie 1
Nettoyer et transformer ses données avec Openrefine : partie 1Nettoyer et transformer ses données avec Openrefine : partie 1
Nettoyer et transformer ses données avec Openrefine : partie 1
 
Meetup Google Cloud
Meetup Google CloudMeetup Google Cloud
Meetup Google Cloud
 

Synchroniser ses applications (plus) simplement

  • 1. Synchroniser ses applications (plus) simplement depuis le PHP Tour 2017, 3 ans ont passé Grégory Planchat, Kiboko SAS
  • 2. Résumé de l’épisode précédent PHP Tour 2017, Nantes ● Environnements IT de plus en plus hétéroclites ● Utilisation d’akeneo/batch sur des grands volumes ● Difficile équilibre entre RAM, I/O et CPU pour gagner en performances ● Écosystème PHP assez pauvre sur le sujet des flux
  • 3. Rappels akeneo/batch Lire Lit un flux Lit un flux, élément par élément, depuis : ● fichiers ● entités Doctrine ● Message Queues ● API ● ... Transformer Transforme l’élément Transforme les éléments lus unitairement pour les faire correspondre au format de destination. Utilise les normaliseurs Symfony ou des mappeurs de données Écrire Enregistre les éléments Enregistre par lot les éléments vers : ● fichiers ● entités Doctrine ● Message Queues ● API ● ...
  • 4. Principales problématiques Lecture ● Fuites mémoire de l’UoW Doctrine ● Difficultés à traiter des sources de données mixtes Processeur ● Lookups unitaires ● Pas de scission des lignes en plusieurs ● Pas de fusion des lignes Ecriture ● Fuites mémoire de l’UoW Doctrine ● Taille d’un batch dans la RAM Job ● Traitements “doublons” ● Pas de scission des lignes en plusieurs lignes
  • 6. L’histoire de Louis, le développeur back-end Louis vient de mettre en production une marketplace pour les 70 magasins d’une enseigne de jardinerie. L’ensemble du catalogue cumule plus de 150.000 références de produits. Chaque magasin veut pouvoir piocher parmi ce catalogue une liste de référence, y appliquer ses prix et ses stocks pour qu’ils soient visibles sur leur section de la marketplace.
  • 7. L’histoire de Louis, le développeur back-end Louis ne dispose pas des outils qui lui permettent de faire des mises à jour quotidiennes. Ses stocks, prix et contenus des catalogues doivent être mis à jour. Il va devoir les développer. Pour cela, il doit faire interagir les ERP des 70 magasins avec la Marketplace. Seulement, les outils dont il dispose ne sont pas adaptés pour traiter des millions d’enregistrements.
  • 10. La Pipeline Louis imagine une manière différente de résoudre son problème : il va traiter son besoin ligne à ligne et permettre d’effectuer autant d’opérations de transformation qu’il sera nécessaire. Louis conçoit un prototype. Changeons de méthode
  • 11. Extraction Extraction des données depuis la source primaire Transformation Transformation des données en un format exploitable Recherche et fusion Fusion des données de la source principale avec des données de sources secondaires ... Le nombre d’opérations de transformation et de recherche n’ont pas de limite Chargement Chargement des données consolidées dans le système tiers
  • 12. La Pipeline Cette pipeline intègre 3 grandes familles de traitements : 1. l’extraction 2. la transformation 3. le chargement Louis utilise le patron de conception ETL Changeons de méthode
  • 13. La Pipeline Live coding git clone git@github.com:php-etl/sandbox.git git checkout step/1-extract-load run pipeline:customers:run data/10000-customers.csv php://stdout ● Au lieu de lire les lignes par lot, nous allons lire les lignes une à une et les traiter comme un flux continu. ● À chaque instant, une seule ligne est placée en mémoire, ce qui permet de traiter le cas de grosses structures de données ● Nous avons besoin de formats source capables d’être lus ligne à ligne (CSV, LDJSON, SQL, etc..) Changeons de méthode
  • 15. Le Mapping des données Louis a réussi à créer ses premières pipelines, il peut lire les données provenant de ses ERP et de son PIM et peut maintenant facilement les agréger. Il écrit beaucoup de fonctions de mapping, elles sont efficaces et ses synchronisations sont rapides. Changeons de méthode
  • 16. Le Mapping des données Live coding git clone git@github.com:php-etl/sandbox.git git checkout step/2-transformation run pipeline:products:run data/10000-products.csv php://stdout ● Le mapping consiste à transformer une donnée d’un format initial vers un format de destination. ● Il peut être effectué sur des données de tous types, il peut permettre par exemple d’aplatir des tableaux à plusieurs dimensions, ou placer les données dans des structures d’objets. Changeons de méthode
  • 18. La génération de code spaghetti Louis a réussi à effectuer son mapping de données. Au fur et à mesure de l’avancement du projet ses fonctions de mapping deviennent de plus en plus difficiles à relire et à maintenir. Il a de plus en plus l’impression d’écrire du code spaghetti, il réfléchit à un moyen de simplifier la maintenance de son code, sans pénaliser les performances qu’il a durement acquises. Changeons de méthode
  • 19. La génération de code spaghetti Louis avait essayé d’utiliser la composition et la configuration pour gérer son mapping, mais les performances n’étaient pas satisfaisantes du tout. Et vient une idée à Louis : et si on créait un compilateur de code qui permettrait d’avoir le meilleur des deux mondes : configurer le mapping et disposer d’un code spaghetti très performant que l’on n’aurait pas à maintenir ? Changeons de méthode
  • 20. La génération de code spaghetti Louis trouve deux pistes très intéressantes : ● nikic/php-parser ● symfony/expression-language Avec ces deux paquets il aura la souplesse dont il a besoin pour générer du code PHP et avoir un langage procédural simple similaire à celui d’Excel. Changeons de méthode
  • 21. La génération de code spaghetti Live coding git clone git@github.com:php-etl/sandbox.git git checkout step/3-fast-map run fast-map:compile run pipeline:products:run data/10000-products.csv php://stdout ● Le code spaghetti n’est un problème que si on n’arrive pas à le faire évoluer ● La transformation d’une configuration en un code PHP brut permet d’éviter des actions parasites. Ces actions n’auront pas de plus-value pendant l’exécution. Elles pourraient ralentir la transformation de données si elle est exécutée des milliers de fois Changeons de méthode
  • 22. La recherche, la fusion et la scission
  • 23. La recherche, la fusion et la scission Maintenant que Louis peut synchroniser deux systèmes ensemble, il a une nouvelle difficulté : comment faire pour lire dans plus d’une source de données ? De la même manière : comment extraire une liste d’images d’après une liste de produits quand un produit peut avoir un nombre indéterminé d’images ? Changeons de méthode
  • 24. La recherche, la fusion et la scission Pour se libérer des contraintes des sources multiples et du lookup unitaire, Louis divise ses Pipelines en deux parties. La partie amont enregistre d’abord les données dans une base de données temporaire. Puis la partie aval extrait le contenu de la base de données vers le système de destination. Grâce aux Jobs de akeneo/batch, Louis peut séquencer l’exécution de ses pipelines en 4 étapes. Changeons de méthode PIM WMS ERP Système tiers 2 1 3 4
  • 25. La recherche, la fusion et la scission La recherche de données complémentaires dans un stockage secondaire peut permettre d’enrichir la source principale de données. Par exemple, si ma source principale de données produits est mon PIM, les sources secondaires seront l’ERP pour les prix et le DAM pour les images. Louis pourra implémenter une étape de transformation qu’il appellera Lookup pour gérer ce besoin. Changeons de méthode
  • 26. La recherche, la fusion et la scission La fusion est l’opération de regrouper plusieurs lignes de la source en une seule ligne. Par exemple, regrouper toutes les lignes d’une commande lorsque l’on reçoit la liste des produits commandés. Louis pourra implémenter une étape de transformation qu’il appellera Merge pour gérer ce besoin. Changeons de méthode
  • 27. La recherche, la fusion et la scission La scission est au contraire l’opération de séparation en plusieurs lignes de la source initialement sur une seule ligne. Par exemple, à partir d’une liste de produits avec leurs images, en extraire la liste des images seules. Louis pourra implémenter une étape de transformation qu’il appellera Fork pour gérer ce besoin. Changeons de méthode
  • 28. Problématiques résolues Lecture ● Fuites mémoire de l’UoW Doctrine ● Difficultés à traiter des sources de données mixtes Processeur ● Lookups unitaires ● Pas de scission des lignes en plusieurs ● Pas de fusion des lignes Ecriture ● Fuites mémoire de l’UoW Doctrine ● Taille d’un batch dans la RAM Job ● Traitements “doublons” ● Pas de scission des lignes en plusieurs lignes
  • 30. Utilisation de la RAM Les pièges L’usage de la mémoire vive peut être un problème lorsque l’on traite un grand nombre de lignes de données. Par exemple, les fonctions json_decode(), json_encode(), file() et les classes de SimpleXML et DOM vont placer l’ensemble de la source (fichier) en mémoire vive. De la même manière, l’utilisation des tableaux en tant que liste de lignes provoquera une augmentation de la consommation de mémoire, en plus de provoquer des ralentissements à chaque redimensionnement du tableau.
  • 31. Fuites mémoire de l’UnitOfWork de Doctrine Les pièges Doctrine utilise de manière interne le pattern Unit of Work pour gérer l’état des entités que l’ORM a sous sa responsabilité. Bien que ce pattern soit très efficace sur des processus courts, comme l’affichage de pages, il peut avoir de lourdes conséquences s’il est mal maîtrisé dans des processus longs ou qui traiteront de grands volumes de données. L’idéal serait de se passer de l’ORM et utiliser des requêtes SQL préparées quand c’est possible. Quand ce n’est pas possible, il faut pouvoir traiter par lots et appeler les méthodes flush() et clear() de l’EntityManager à la suite de l’enregistrement de chaque lot.
  • 33. Projets Open-Source L’ensemble des projets sont disponibles sur Github : ● Contrats : https://github.com/php-etl/contracts ● Pipeline : https://github.com/php-etl/pipeline ● Bucket : https://github.com/php-etl/bucket ● Mappers compilés : https://github.com/php-etl/fast-map ● Exemples dans cette présentation : https://github.com/php-etl/sandbox
  • 36. Merci Crédits illustrations : Freepik Stories Code source sur https://github.com/php-etl/sandbox