Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Application du concept d'ETL pour faire des jobs avancés

Application du concept d'ETL pour faire des jobs avancés

Retour d'expérience et présentation de la solution retenue chez VeryLastRoom lors du sfPot Marseille

Timothée Barray

September 12, 2013
Tweet

More Decks by Timothée Barray

Other Decks in Programming

Transcript

  1. APPLICATION DU CONCEPT D'ETL POUR FAIRE DES BATCHS FORTS EN

    CHOCOLAT. Présentation par Timothée Barray : twitter.com/timbarray github.com/tyx
  2. ETL ? Wikipedia : “ Permettre d'effectuer des synchronisations massives

    d'informations d'une source vers une autre. ”
  3. Importer un fichier csv en base ? Exporter des données

    en json ? Convertir un csv en xml ?
  4. ILLUSTRATION < ? p h p / / E x

    t r a c t $ c s v = n e w S p l F i l e O b j e c t ( $ f i l e n a m e ) ; $ c s v - > s e t F l a g s ( S p l F i l e O b j e c t : : R E A D _ C S V ) ; $ c s v - > s e t C s v C o n t r o l ( " ; " , ' " ' ) ; f o r e a c h ( $ c s v a s $ l i n e ) { $ e l e m e n t = $ l i n e - > f g e t c s v ( ) ; / / T r a n s f o r m $ r e s u l t = $ t r a n s f o r m e r - > t r a n s f o r m ( $ e l e m e n t ) ; / / L o a d $ l o a d e r - > l o a d ( $ r e s u l t ) ; }
  5. EN RÉSUMÉ Extract Transform Loader csv to object mysql mysql

    to array json http consolidation xml AMQP business callback Mail ... ... ... Vous avez compris l'idée...
  6. ON A CHERCHÉ UNE APP QUI : fait juste de

    l'ETL, facile à mettre en place, Pouvoir lui injecter notre code métier en PHP Facilement à interconnecter avec un environnement Symfony
  7. Trop lourd: Fait beaucoup d'autres choses Trop compliqué à intégrer

    à notre workflow Mais ça marche bien hein ! Groupon l'utilise
  8. Utilisée dans OroCRM Fait très bien le job pour des

    cas simples ! Ne permet pas de chainer les jobs à l'infini Pas super flexible (workflow déjà implémenté et basique) Pas de couche transport
  9. POURQUOI ?! PARCE QU'IL RESTAIT ENCORE TROP DE CODE À

    ÉCRIRE PARDI ! Et chez VeryLastRoom on aime pas ça écrire du code.
  10. Code pour faciliter l'usage de php-etl Code pour créer des

    jobs avancés Code pour la couche transport Code pour les edges cases Code pour limiter le code business à sa plus simple expression
  11. RAPPEL : < ? p h p / / E

    x t r a c t $ c s v = n e w S p l F i l e O b j e c t ( $ f i l e n a m e ) ; $ c s v - > s e t F l a g s ( S p l F i l e O b j e c t : : R E A D _ C S V ) ; $ c s v - > s e t C s v C o n t r o l ( " ; " , ' " ' ) ; f o r e a c h ( $ c s v a s $ l i n e ) { $ e l e m e n t = $ l i n e - > f g e t c s v ( ) ; / / T r a n s f o r m $ r e s u l t = $ t r a n s f o r m e r - > t r a n s f o r m ( $ e l e m e n t ) ; / / L o a d $ l o a d e r - > l o a d ( $ r e s u l t ) ; }
  12. CA FAIT PLUS DE CODE ON EST D'ACCORD ? MAIS

    CA NE FERA JAMAIS PLUS DE CODE QUE ÇA ! CHAQUE EXTRACTOR, TRANSFORMER, LOADER ÉCRIT EST FACILEMENT RÉUTILISABLE
  13. PHP MEMORY LIMIT ? Pouvoir s'en affranchir en ne lançant

    pas de gros portions de code qui font tout.
  14. TRANSPORT PHP Stock le résultat dans un tableau, le job

    suivant va lire le tableau... Pas très scalable ! Mais suffisant pour certains cas ;)
  15. TRANSPORT RABBITMQ Stock le résultat de chaque job dans une

    queue, le job suivant va lire la queue. Chaque itération est très petite, plus de problème de memory limit ! Et on peut lancer plusieurs workers... scalable !
  16. EXPORTER DES PHOTOS STREETVIEW DES BARS DE MARSEILLE Client :

    https://github.com/rezzza/jobflow/blob/master/examples/placeto rmq.php Worker RabbitMq : https://github.com/rezzza/jobflow/blob/master/examples/worke Notre Job: https://github.com/rezzza/jobflow/blob/master/examples/jobs/P
  17. CHAINER LES JOBS Exporter dans un csv les emails des

    contributeurs de Symfony. Client : https://github.com/rezzza/jobflow/blob/master/examples/placeto rmq.php Worker RabbitMq : https://github.com/rezzza/jobflow/blob/master/examples/worke Notre Job: https://github.com/rezzza/jobflow/blob/master/examples/jobs/P
  18. JOBFLOW EST ENCORE EN BÊTA Mais vous pouvez déjà le

    tester hein ! Et même contribuer ;)
  19. INJECTER FACILEMENT VOS JOBS < s e r v i

    c e i d = " j o b . t y p e . h o n e y _ t r a n s f o r m e r " c l a s s = " V l r \ H i v e B u n d l e \ J o b \ T y p e \ H o n e y < t a g n a m e = " j o b . t y p e " a l i a s = " h o n e y _ t r a n s f o r m e r " > < / t a g > < / s e r v i c e >
  20. ON PEUT FACILEMENT LANCER DES WORKERS RABBITMQ... a p p

    / c o n s o l e j o b f l o w : w o r k e r
  21. PUIS LANCER NOTRE JOB Grâce à une commande symfony aussi

    : a p p / c o n s o l e j o b f l o w : r u n " m o n . j o b . i d " - - t r a n s p o r t = r a b b i t m q
  22. SANS CODE EN PLUS, MON JOB EST ASYNCHRONISÉ JEUNE !

    Plus simple à débugger : L'état de notre job est dumpable !