Download - Spring Batch Avance

Transcript
Page 1: Spring Batch Avance

SUGF

Spring Batch AvancéMardi 20 Décembre 2011

Spring User Group France

Olivier Bazoud

Julien Jakubowski

Page 2: Spring Batch Avance

SUGF IntervenantsOlivier Bazoud @obazoud, Ekino @3k1n0

ISEN (Toulon)

Architecte technique

Java EE / Spring, Spring Batch, NoSQL, Node.js

Co-auteur de « Spring Batch in Action »

Spring User Group France

Julien Jakubowski, @jak78, OCTO TechnologyISEN (le vrai, de Lille)

Architecte technique

Spécialisé Java EE / Spring

Ch'ti JUG, Agile Tour Lille

Page 3: Spring Batch Avance

SUGF De quoi va-t-on parler ce soir ?

• On va parler de batchs en Java

• … et aussi (un peu) de bière

http://www.flickr.com/photos/fromeyetopixel/2559391584/

• des techniques avancés

Page 4: Spring Batch Avance

SUGF Nos objectifs

En sortant de la salle, vous savez:

Identifier certains problèmes récurrents avec les batchs écrits en Java

Si Spring Batch est utile pour vous (ou pas)

Intégrer les notions principales

Intégrer les notions avancées

Faire un batch « Spring Batch » dès demain

Page 5: Spring Batch Avance

SUGF Ce qui vous attend• Rappel de l’épisode précédent

• Notions avancées – Vote

• Questions / Réponses

Page 6: Spring Batch Avance

SUGF

Concepts de baseRappel de l’épisode précédent (?)

Page 7: Spring Batch Avance

SUGF Batch : de quoi parle-t-on ?

Batch processing = répétition de traitements sur un ensemble de données…

Page 8: Spring Batch Avance

SUGF Batch : de quoi parle-t-on ?

… potentiellement grands volumes…

http://www.flickr.com/photos/claudiasofia99/2878579560/

Page 9: Spring Batch Avance

SUGF Batch : de quoi parle-t-on ?

… sans intervention d’un utilisateur humain – pas d’interface homme-machine

Page 10: Spring Batch Avance

SUGF Batch : de quoi parle-t-on ?

Exemples:• Import flat / XML dans une base de données• Mise à jour de données de référentiel• Intégration de flux financiers dans un SI

Page 11: Spring Batch Avance

SUGF Batch : de quoi parle-t-on ?

Un batch n’est pas un scheduler• Cron, inotify, Quartz, $U…• Mais un scheduler peut le lancer

Page 12: Spring Batch Avance

SUGF Problèmes récurrents• Fiabilité

Page 13: Spring Batch Avance

SUGF Problèmes récurrents• Maintenabilité

Page 14: Spring Batch Avance

SUGF Problèmes récurrents• Réinvention de la roue… carrée

Page 15: Spring Batch Avance

SUGF Quand j’écris un batch

http://www.flickr.com/photos/crystaljingsr/3914729343/sizes/o/in/set-72157622354789320/

Je suis… à poil, non ?

Page 16: Spring Batch Avance

SUGF Solution

Spring Batch offre pourtant une solution pour vous guider lors de l’écriture de vos batchs en Java

Page 17: Spring Batch Avance

SUGF

Spring Batch

Notions de base

Page 18: Spring Batch Avance

SUGF Exemple d’un batch

RecipeStep

InitialStep

InitialTasklet

Chunk oriented tasklet

ItemReader ItemWriterItemProcessor

Page 19: Spring Batch Avance

SUGF Tasklet

• Besoin– Effectuer une tâche unitaire

• Exemples– Unzip d’un fichier– Appel d’une procédure stockée– Appel d’un web service

Page 20: Spring Batch Avance

SUGF ItemReader• Besoin

– Lire le XML de recettes au format BeerXML

• ItemReader– Fournit des items en entrée

<xml>

123;AB;456;CD;

SELECT ... FROM ...

Page 21: Spring Batch Avance

SUGF ItemProcessor• Besoin

– Transforme, valide et / ou filtre une recette

• ItemProcessor– Transforme un item en un autre– Filtrer ou rejeter un item– Emplacement pour les « règles métier »

Page 22: Spring Batch Avance

SUGF ItemWriter• Besoin

– Décharge les bières dans une base SQL

• ItemWriter– Ecrit les items

<xml>

123;AB;456;CD;

INSERT... INTO ...

Page 23: Spring Batch Avance

SUGF Chunk

• Besoin– Lire, transformer et écrire

• Chunk1. Lire et transformer les données successivement

2. Ecrire le lot de données

– Le commit-interval définit la taille du lot– Gestion de la transaction : Commit/Rollback

Page 24: Spring Batch Avance

SUGF Chunk

Page 25: Spring Batch Avance

SUGF Job

• Besoin– Décrire les étapes du batch– Composé d’un ou plusieurs Steps

Spring Tools Suite

Page 26: Spring Batch Avance

SUGF Exemple d’un batch

RecipeStep

InitialStep

InitialTasklet

Chunk oriented tasklet

ItemReader ItemWriterItemProcessor

Page 27: Spring Batch Avance

SUGF Tests

• Tests unitaires facilités via le découpage Spring Batch– writers, processors etc...

• Tests d'intégration facilités par Spring– @RunWith– Step, Job

Page 28: Spring Batch Avance

SUGF Forces et faiblesses

✔Fiabilité et bons patterns✔Tests unitaires et d'intégration, TDD✔ ...the Spring way, intégration à Spring✔Batchs complexes mieux maintenables✔Bénéficie de fonctions avancées à moindre coût✔Productivité, à terme...✗… après avoir payé le ticket d'entrée

Page 29: Spring Batch Avance

SUGFDes questions,avant la suite ?

http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/

Page 30: Spring Batch Avance

SUGF

Spring BatchAllons plus loin

Page 31: Spring Batch Avance

SUGF Maître détailRecipe

HopHopHop

R;Burton Ale;All Grain;Brad SmithH;Goldings, East Kent;United KingdomH;Northern Brewer;GermanyH;Fuggles;United KingdomENDR;Dry Stout;All Grain;Brad SmithH;Fuggles;United KingdomEND

Page 32: Spring Batch Avance

SUGF Un batch plus robuste reprise sur erreurs

Page 33: Spring Batch Avance

SUGF Flow

Step A

Step B

Page 34: Spring Batch Avance

SUGF Spring Batch Admin

Page 35: Spring Batch Avance

SUGF Scaling et parallélisme

http://www.flickr.com/photos/claudiasofia99/2878579560/

Page 36: Spring Batch Avance

SUGF Spring Batch et Hibernate

Page 37: Spring Batch Avance

SUGF Allons plus loin…

• Un cas un peu plus complexe– maître / détail

• La reprise sur erreurs• Un flow qui n’est pas de bisounours…• Spring Batch Admin (et Monitoring)• Scaling et parallélisme• Spring Batch et Hibernate

Page 38: Spring Batch Avance

SUGF Maître détailRecipe

HopHopHop

R;Burton Ale;All Grain;Brad SmithH;Goldings, East Kent;United KingdomH;Northern Brewer;GermanyH;Fuggles;United KingdomENDR;Dry Stout;All Grain;Brad SmithH;Fuggles;United KingdomEND…

Page 39: Spring Batch Avance

SUGFMaître détail

Déclaration du reader custom

Page 40: Spring Batch Avance

SUGF

R;Burton Ale;All Grain;Brad SmithH;Goldings, East Kent;United KingdomH;Northern Brewer;GermanyH;Fuggles;United KingdomENDR;Dry Stout;All Grain;Brad SmithH;Fuggles;United KingdomEND

Page 41: Spring Batch Avance

SUGFMaître détail

Déclaration du reader délégué

Page 42: Spring Batch Avance

SUGF A retenir

• Implémentation de notre propre reader– Ré-utilisation d’un reader déjà fourni par

Spring Batch– Ré-utilisation de ce que nous avons déjà codé

précédemment

ou• Spring Batch pense à vous

– PatternMatchingCompositeLineTokenizer

Page 43: Spring Batch Avance

SUGF Un batch plus robuste

Page 44: Spring Batch Avance

SUGF Reprise sur erreur

• Un batch plus robuste (tolérant à l’erreur) c’est un batch :– Qui survit à quelques données invalides– Qui survit à une indisponibilité– Qu’on est en mesure de relancer

Page 45: Spring Batch Avance

SUGF Reprise sur erreur

• Spring Batch out-of-the-box propose:– Sauter les erreurs non bloquantes (skip)– Recommencer un traitement (retry)– Déterminer si le batch est fini (completion)– Redémarrer un batch (restart)

Page 46: Spring Batch Avance

SUGF Reprise sur erreur

Page 47: Spring Batch Avance

SUGF Reprise sur erreur: Skip

• Ne pas arrêter le batch si la lecture/process/écriture échoue

• Personnaliser les cas de « skip »• Ecouter les cas de « skip »

0001;ABC;DEF;0002;ABC;DEF;000zxjgxdjghjsdfkud0004;ABC;DEF;

Page 48: Spring Batch Avance

SUGF Reprise sur erreur: Skip

– Si FlatFileException, Spring Batch skip l’item– Skip de 10 items max– Au-delà la step « failed »– Include/Exclude possible

Page 49: Spring Batch Avance

SUGF Reprise sur erreur: Skip

• Personnaliser la gestion du « skip »• Par défaut: LimitCheckingItemSkipPolicy

Page 50: Spring Batch Avance

SUGF Reprise sur erreur: Skip

• Configuration de la gestion du « skip »

Page 51: Spring Batch Avance

SUGF Reprise sur erreur: Skip

• Un listener permet de traiter les items écartés

• Les annotations existent aussi– @OnSkipInRead– @OnSkipInWrite– @OnSkipInProcess

Page 52: Spring Batch Avance

SUGF Reprise sur erreur: Retry

Page 53: Spring Batch Avance

SUGF Reprise sur erreur: Retry

• Permet de relancer une opération si indispo temporaire

• Personnaliser les cas de « retry »• Ecouter les cas de « retry »

Page 54: Spring Batch Avance

SUGF Reprise sur erreur: Retry

– Si DLDAE, Spring Batch recommence– Retry 3 fois max– Au-delà la step « failed »– Includes/Excludes possible

Page 55: Spring Batch Avance

SUGF Reprise sur erreur: Retry

• Personnaliser le « retry »: RetryPolicy– SimpleRetryPolicy (défaut)

• Stratégie entre 2 « retry »: BackoffPolicy– NoBackOffPolicy (défaut)– ExponentialBackOffPolicy vraiment utile

Page 56: Spring Batch Avance

SUGF Reprise sur erreur: Retry

• Configuration de la gestion du « retry »

Page 57: Spring Batch Avance

SUGF Reprise sur erreur: Retry

• Un listener permet de traiter les « retry »

Page 58: Spring Batch Avance

SUGF Reprise sur erreur: Retry

• Pour les tasklets– RetryTemplate– RetryOperationsInterceptor avec de l’AOP

Page 59: Spring Batch Avance

SUGF Reprise sur erreur: Restart

Page 60: Spring Batch Avance

SUGF Reprise sur erreur: Restart

• Même avec skip/retry, un batch peut planter

• Il reste encore une solution • Nous pouvons redémarrer le batch

Page 61: Spring Batch Avance

SUGF Reprise sur erreur: Restart

• Indique si le job est « restartable »

• Indique le nombre max de « restart »

Page 62: Spring Batch Avance

SUGF Reprise sur erreur: Restart

• La step est démarrée lors du restart même si elle a été terminée correctement

Page 63: Spring Batch Avance

SUGF Reprise sur erreur: Restart

• Comment reprendre en plein milieu d’un chunk ?

• Comment Spring Batch sait il où reprend ?

Page 64: Spring Batch Avance

SUGF Reprise sur erreur: Restart

• Spring batch stocke des méta data

Page 65: Spring Batch Avance

SUGF Reprise sur erreur: Restart

• Spring Batch persiste régulièrement les « ExecutionContext »

• Ceci permet à Spring Batch de savoir où reprendre

• C’est ce qui fait qu’un batch est « restartable »

Page 66: Spring Batch Avance

SUGF Reprise sur erreur: Restart

• Si vous voulez que vos Reader/Writer custom soient restartables, vous devez les concevoir restartables!

• Certains fournis par Spring Batch le sont, mais pas tous

• Ce n’est pas toujours possible – ex: Writer JMS.

Page 67: Spring Batch Avance

SUGF Reprise sur erreur: Restart

• ItemStream

Page 68: Spring Batch Avance

SUGF Reprise sur erreur: Restart• Exemple de Reader « restartable »

Page 69: Spring Batch Avance

SUGF Reprise sur erreurConclusion

• Nous avons appris comment:– Ecarter des items défectueux (skip)– Recommencer une step s’il y a une erreur

temporaire (retry)– Implémenter notre propre stratégie de

« skip » et « retry »– Redémarrer un job avec certains steps

Page 70: Spring Batch Avance

SUGF Gestion du flow

Page 71: Spring Batch Avance

SUGF Gestion du flow

Le « batch bisounours »

Step A

Step B

Page 72: Spring Batch Avance

SUGF Gestion du flow

Exemple

Page 73: Spring Batch Avance

SUGF Gestion du flow

Exemple

Page 74: Spring Batch Avance

SUGF Gestion du flow• Le « batch complexe»

Step

Step

Step

Step

Step

Step

Step

Step

Step

Page 75: Spring Batch Avance

SUGF Gestion du flow

• Comment…– faire des flows non linéaires– piloter l’enchaînement des steps– passer des données entre steps

Page 76: Spring Batch Avance

SUGF Gestion du flow

• Exemple plus simple ;)

StepA

StepB

StepAlertFAILED

*

Page 77: Spring Batch Avance

SUGF Gestion du flow

Page 78: Spring Batch Avance

SUGF Gestion du flow

• Batch Status– Etat du job / step en cours d’exécution

• Exit Status– Etat du job ou step après son exécution– C’est lui qui détermine le flow

• Exemple– COMPLETED, STARTING, STARTED,

STOPPING, STOPPED, FAILED,ABANDONED or UNKNOWN

– C?T (CAT mais pas COUNT), C*T (CAT et COUNT)

Page 79: Spring Batch Avance

SUGF Gestion du flow

• Créer et utiliser ses propres « exit status » – StepExecutionListener– JobDecider

Page 80: Spring Batch Avance

SUGF Gestion du flow

• Utiliser ses propres « exit status »

StepA

StepB

StepC

COMPLETED WITH SKIPS

*

Page 81: Spring Batch Avance

SUGF Gestion du flow

• « exit status » + StepExecutionListener

Page 82: Spring Batch Avance

SUGF Gestion du flow• Configuration

Page 83: Spring Batch Avance

SUGF Gestion du flow

• « exit status » + JobExecutionDecider

Page 84: Spring Batch Avance

SUGF Gestion du flow• Configuration

Page 85: Spring Batch Avance

SUGF Gestion du flow

• « StepExecutionListener » ou « JobExecutionDecider » ?

• JobExecutionDecider pour réutiliser plus facilement la logique de branchement

Page 86: Spring Batch Avance

SUGF Gestion du flow

• Encore plus de contrôle: end, fail

Page 87: Spring Batch Avance

SUGF Gestion du flow

• Partager des informations entre les steps– À la Spring:bean classic– A la Spring Batch: « Execution context  »

• 1 pour le Job et 1 par Step• C’est une Map sauvegardé dans les meta data• Attention au volume• Late bindings

– #{jobExecutionContext[‘myKey']}

Page 88: Spring Batch Avance

SUGF Gestion du flow

• Accès à ExecutionContext

Page 89: Spring Batch Avance

SUGF Gestion du flow

• Configuration

Page 90: Spring Batch Avance

SUGF Gestion du flow

• Mutualiser les flowsStep A

Step B

Step C

Step D

MonFlow

Page 91: Spring Batch Avance

SUGF Gestion du flow• Configuration

Page 92: Spring Batch Avance

SUGF Gestion du flow• Réutiliser un Job

Page 93: Spring Batch Avance

SUGF Gestion du flow

• Conclusion, nous avons– Fait des flows non linéaires– Piloté l’enchaînement des steps– Passé des données entre steps– Mutualisé et réutilisé des jobs

Page 94: Spring Batch Avance

SUGF Spring Batch Admin

• Console Web pour Spring Batch– « Standalone » ou « Embedded »– API Rest– Uploader une nouvelle configuration– Uploader un fichier à traiter

• « Customisable »– Base de données, Branding, UI, ..

• Monitorer les batchs

Page 95: Spring Batch Avance

SUGF Spring Batch Admin

• API REST

Page 96: Spring Batch Avance

SUGF Spring Batch Admin

$ curl –s http://localhost:8080/spring-batch-admin-sample/jobs.json

{ "jobs": { "resource": "http://localhost:8080/spring-batch-admin-sample/jobs.json", "registrations": { "infinite": { "name": "infinite", "resource": "http://localhost:8080/spring-batch-admin-sample/jobs/infinite.json", "description": "No description", "executionCount": 0, "launchable": true, "incrementable": false }, "job1": { "name": "job1", "resource": "http://localhost:8080/spring-batch-admin-sample/jobs/job1.json", "description": "No description", "executionCount": 0, "launchable": true, "incrementable": true …

Page 97: Spring Batch Avance

SUGF Spring Batch Admin

• Les jobs

Page 98: Spring Batch Avance

SUGF Spring Batch Admin

• Lancement / Historique d’un job

Page 99: Spring Batch Avance

SUGF Spring Batch Admin

• Lancer un job

Page 100: Spring Batch Avance

SUGF Spring Batch Admin

• Détail d’un job execution

Page 101: Spring Batch Avance

SUGF

Spring Batch Admin• Détail d’éxécution

Page 102: Spring Batch Avance

SUGF Spring Batch Admin / Monitoring

• JMX / MBean– BatchMBeanExporter

• Exporter un jobService• Voir les métriques des « Job/Steps Executions »

– SLA StepExecutionServiceLevelMonitor• Permet de recevoir des notifications JMX si une

Step met trop de temps

• Utilisable aussi en Standalone

Page 103: Spring Batch Avance

SUGF Spring Batch Admin / Monitoring

Page 104: Spring Batch Avance

SUGF Spring Batch Admin / Monitoring

Page 105: Spring Batch Avance

SUGF Spring Batch Admin

• Conclusion, nous avons aborder– Les principaux écrans de « Spring Batch

Admin »– L’API Rest– Le monitoring par JMX

Page 106: Spring Batch Avance

SUGF Scaling

http://www.flickr.com/photos/claudiasofia99/2878579560/

Page 107: Spring Batch Avance

SUGF Scaling

Page 108: Spring Batch Avance

SUGF Scaling

• Différentes stratégies possibles– Multi-threaded Step (single process)– Parallel Steps (single process)– Remote Chunking of Step (multi process)– Partitioning a Step (single or multi process)

Page 109: Spring Batch Avance

SUGF Scaling

• Multi-threaded Step– Une Step est multi threaded

• Parallel Steps– Les Steps sont exécutées en parallèle

• Remote Chunking of Step– Distribution des chunks

• Partitioning a Step– Partage les données à travers les noeuds

Page 110: Spring Batch Avance

SUGF Scaling: Multi-threaded Step

– Multi thread au niveau « Step »– Utilise un ThreadPoolTaskExecutor– Chaque thread construit un chunk– Les readers/writers sont thread-safe ?

• La plus part non! ils sont stateful

– « Process Indicator Pattern »• Lire les items ‘processed’ = false• Un ItemProcessor met ‘processed = true’

Page 111: Spring Batch Avance

SUGF Scaling: Multi-threaded Step

Page 112: Spring Batch Avance

SUGF Scaling: Step en parallèle

• Executer plusieurs Step en parallèle• Mot clé « split » dans la configuration• Possibilité utiliser un

ThreadPoolTaskExecutor

Page 113: Spring Batch Avance

SUGF Scaling: Step en parallèle

Page 114: Spring Batch Avance

SUGF Scaling: Remote Chunking

• Répartition de la charge vers des slaves– Lecture sur le Master– Processor et Writer sur les slaves

• Spring Batch propose des interfaces/classes

• Spring Integration propose une implementation

• La relation master/slave : MOM– ActiveMQ, RabbitMQ, …

Page 115: Spring Batch Avance

SUGF Scaling: Remote Chunking Master

Slave 1

ChunkProcessor

Writer

ChunkProcessor

Reader

ChunkProvider

Slave 2

ChunkProcessor

Writer

Slave N

ChunkProcessor

Writer

Page 116: Spring Batch Avance

SUGF Scaling: Remote Chunking

• Démo ?!

Page 117: Spring Batch Avance

SUGF Scaling: Partitioning

• Répartir les données suivant une clé de partition– « Partitionner »

• Traiter les données– « PartitionHandler »

• Et vous pouvez combiner les techniques précédentes

Page 118: Spring Batch Avance

SUGF Scaling: Partitioning

Page 119: Spring Batch Avance

SUGF Scaling

• Conclusion, nous avons aborder– Les stratégies possibles– La démo «  Remote Chunking of Step »

Page 120: Spring Batch Avance

SUGF Spring Batch et Hibernate

Page 121: Spring Batch Avance

SUGF Spring Batch et Hibernate

• Les raisons– code existant– rapidité de développement (les premiers 80%)

• Ca ne se fait pas sans dangers…

Page 122: Spring Batch Avance

SUGF Spring Batch et Hibernate

• Votre mapping Hibernate est il fait pour du batch ?– Ai-je besoin de tous les fetchs ?!– Select N+1 ?!

• Overhead de Hibernate sur JDBC

Page 123: Spring Batch Avance

SUGF Spring Batch et Hibernate

• Hibernate est stateful (par défaut)– 1M d’items lus = 1M en RAM OutOfMemoryError

• Utiliser HibernateCursorItemReader– 1 requête HQL– Session stateless

Page 124: Spring Batch Avance

SUGF Spring Batch et Hibernate

• Pattern: « Driving Query Based ItemReaders »

• Certaines bases de données (ex: DB2)– Pessimitic looking– Ouverture de curseurs sur des données

importantes• Bonne pratique avec Hibernate• Prévient les LazyException

Page 125: Spring Batch Avance

SUGF Spring Batch et Hibernate

• Principe– L’ItemReader lit les « id » via SQL

• Select id from XXX where …

– Le premier ItemProcessor transforme l’id en objet via Hibernate par exemple

– Les autres processors font les traitements métiers

– …

Page 126: Spring Batch Avance

SUGF Questions ?

http://www.flickr.com/photos/crystaljingsr/3914729343/in/set-72157622354789320/

Page 127: Spring Batch Avance

SUGF Quizz

Page 128: Spring Batch Avance

SUGF Spring Batch in Action

http://www.manning.com/templier

Page 129: Spring Batch Avance

SUGF Ekino / @3k1n0• Conception, développement et

maintenance de dispositifs digitaux• 150 personnes

– 50% de développeurs, 0% de régie• Digital

– Mobile + HTML + RIA– JAVA + PHP + .NET

• 6 pôles de compétences, 25 clients, 50 projets/an = 1 équipe

Page 130: Spring Batch Avance

SUGF Quizz 1

Ce que n'est pas Spring Batch ?

1. un framework orienté batchs

2. un scheduler

3. un framework open source

Page 131: Spring Batch Avance

SUGF Quizz 2

Qui est le principal leader du projet Spring Batch ?

1. Antonio Goncalves

2. Obi-wan Kenobi

3. Dave Syer

Page 132: Spring Batch Avance

SUGF Quizz 3

Comment s'appelle la console d’admin de Spring Batch ?

1. Coldfusion Web Console

2. Spring Batch Admin

3. PlayScalaInCloud

Page 133: Spring Batch Avance

SUGF Quizz 4

Quel est l’objet qui n’existe pas en « Spring Batch » ?

1. ItemReader

2. ItemWriter

3. ItemBien

Page 134: Spring Batch Avance

SUGF Quizz 5

Qui vous offre un exemplaire de « Spring Batch in Action »?

1. Sais pas, je viens de me réveiller

2. Ekino

3. Le père Noël

Page 135: Spring Batch Avance

SUGF Liens• Spring User Group Paris

– http://groups.google.fr/group/sugfr

• Le code de la présentation– https://github.com/obazoud/spring-batch-sug

• Spring Batch 2.1.x– http://static.springsource.org/spring-batch

• Articles sur le web– http://www.theserverside.com/news/1363855/Spring-Batch-Overview– http://www.infoq.com/presentations/syer-introducing-spring-batch– http://blog.zenika.com/index.php?post/2010/03/05/To-batch-or-not-to-

batch– http://blog.octo.com/spring-batch-par-quel-bout-le-prendre/

Page 136: Spring Batch Avance

SUGF ROTI

http://www.flickr.com/photos/34943981@N00/202923614/

Page 137: Spring Batch Avance

SUGF Session « Spring Batch Avancé»

• Ekino– http://www.ekino.com / @3k1n0– Olivier Bazoud / @obazoud

• Octo Technology– http://www.octo.com / @ OCTOTechnology– Julien Jakubowski / @jak78