Interface21 UG

Spring Batch
Mercredi 20 Novembre 2013

Olivier Bazoud
Intervenant
Olivier Bazoud @obazoud
Senior developer Kyriba
Spring-* / JEE, NoSQL, Node.js
Scala bientôt ;)
Co-auteur de “Spring Batch in Action”
Sommaire
➢ C’est quoi un batch ?
➢ Problèmes récurrents
➢ Notions de bases
➢ Notions avancées
➢ Conclusion
C’est quoi un batch ?
Répétition de traitements sur des données
➔ Sur des grands volumes
C’est quoi un batch ?
… sans intervention d’un utilisateur humain
➔ pas d’interface homme-machine
C’est quoi un batch ?

batch ≠ scheduler
C’est quoi un batch ?
Exemples:
• Import flat / XML dans une base de données
– Nouveaux clients
– Flux financier…

• Mise à jour de données
– référentiel
• …
Problèmes récurrents
• Fiabilité
Problèmes récurrents
• Maintenabilité
Problèmes récurrents
• Réinvention de la roue… carrée
Spring Batch
Notions de base
Spring Batch propose…
•
•
•
•
•
•

Un cadre
Un vocabulaire (domain language)
Traitement par lots
Flow, Reprise sur erreur, …
Spring dans ses batchs
…
Parallélisme

Scaling
Partitionnement

Spring Batch Admin
Monitoring
Spring Batch
“Spring Batch is a lightweight,
comprehensive batch framework
designed to enable the development of
robust batch applications vital for the
daily operations of enterprise systems.”
Infrastructure
Application
Insérer des départements et des villes
dans une base de données à partir de
fichier XML
Spécifications

3.

Unzip du fichier (départements + villes)
Charger des départements dans la base
Charger des villes dans la base

➢

Lancer la web application

1.
2.
Flow
Dézipper le fichier zip

Insert des départements

Insert des villes
Job
●
●

Validation des paramètres du “job”
Composé d’une ou plusieurs étapes
○

●
●

pas forcément linéaire

Liste un ensemble de Listeners
Peut hériter d’un autre job
Flow
Dézipper le fichier zip

Ajouter des départements

Ajouter des villes
Step
●
●

Etape dans le processus du batch
“Separation of Concerns”
○

●

Distinction entre l’enchainement des étapes
et leur éxécution

Liste un ensemble de Listeners
Step
Flow
Dézipper le fichier zip

Ajouter des départements

Ajouter des villes

Lancer une commande système unzip
Tasklet
●

Permet d’éxecuter une tâche
○
○

Appel à une commande système
Appel un webservice
Tasklet
Flow
Dézipper le fichier zip

Ajouter des départements

Lire un département
(xml)
Processer

Ecrire des départements
Ajouter des villes
ItemReader
●
●
➢

Lire un flux de données
Résistant aux gros volumes
Lire une base, un fichier XML, ...
ItemProcessor
●
●

Transforme, valide et/ou filtre la donnée
Emplacement des rêgles métiers
ItemWriter
●

➢
➢
➢

Ecrire un lot de données
Ecriture par lot
Ecrire dans une base de données
Ecrire un fichier XML, CSV, ...
Reader/Processor/Writer
Flow
Dézipper le fichier zip
Lire une ville
(xml)
Ajouter des départements
Processer

Ajouter des villes

Ecrire des villes
Chunk
Lire, Transformer et Ecrire
➢
➢
➢

Ecriture par lot
Limiter la consommation mémoire
Optimiser l’écriture
Chunk

Taille du lot = commit interval = 2
Chunk
Chunk
Tests
● Coder un batch en TDD
○ POJO every where (Procesor)
● Tests d'intégration facilités
○ @RunWith
○ Step, Job
Tests
Listeners
Listeners
★
★
★
★
★
★

JobExecutionListener
StepListener
Item{Read,Process,Write}Listener
StepExecutionListener
SkipListener, RetryListener
...
Spring Batch 2.2
Juin 2013
Java Config
Support de Spring Data
Non-identifying Job Parameters
AMQP support
Forces et faiblesses
✔ Batchs complexes mieux maintenables
✔ Productivité
✔ Tests
✔ Ticket d'entrée
✔ Ne convient pas à tous les batchs
Retour d’expérience
• Avec « Spring Batch »
– Moins de code produit
– Plus de tests unitaires & intégrations
– Spring Batch s'occupe de la montée en charge

• Gain par rapport à un batch « legacy »
– XML 100Mo + SQL; Gain : de 60 mn à 8mn
– 10 fichiers 4Mo + SQL; Gain : de 10mn à 1mn30s
– ~20 fois rapide qu’un batch en … PHP ;)
JSR-352 « javax.batch »

Ressemble beaucoup à
Spring Batch
Spring Batch
Allons plus loin
Un batch plus robuste
reprise sur erreurs
Reprise sur erreur
●

Sauter les erreurs non bloquantes (skip)
○

●

Recommencer un traitement (retry)
○

●

survivre à quelques données invalides
survivre à une indisponibilité temporaire

Redémarrer un batch (restart)
○

on est en mesure de le relancer
Skip
0001;ABC;DEF;
0002;ABC;DEF;
000zxjgxdjghjsdfkud
0004;ABC;DEF;

• Au-delà du « skip-limit », failed
• Personnaliser le « skip »
• SkipListener pour écouter
Retry
Retry
●
●

Relancer une opération si indisponibilité
Au-delà du « retry-limit », failed (défaut)
○

●

RetryPolicy
○

●

Personnaliser le « retry »
Stratégie entre 2 « retry »: BackoffPolicy

RetryListener pour écouter
Restart
Restart
• Spring batch stocke des méta data
Restart
• Indique si le job est « restartable » ou pas

• Indique le nombre max de « restart »

• Reader/Writer doivent être « restartable »
Reprise sur erreur
• Ecarter des items défectueux (skip)
• Recommencer une step s’il y a une erreur
temporaire (retry)
• Redémarrer un job (restart)
Gestion du flow
Gestion du flow
Dézipper le fichier zip

*
Ajouter des départements

*
Ajouter des villes

failed

Alertes
Gestion du flow
Gestion du flow
• Status
– Etat du job/step en cours/après d’exécution

• Créer et utiliser ses propres « status »
• Gérer le flow
– StepExecutionListener
– JobDecider
Scaling
Scaling
Scaling
– Multi-threaded Step (single process)
• Une Step est multi threaded

– Parallel Steps (single process)
• Les Steps sont exécutées en parallèle

– Remote Chunking of Step (multi process)
• Distribution des chunks par slave

– Partitioning a Step (single or multi process)
• Partage les données à travers les slaves
Scaling “Partitioning”
• Répartir les données suivant une clé de
partition ⇒ « Partitionner »
• Traiter les données ⇒ « PartitionHandler »
Horizontal Scaling
• RabbitMQ: Message-Oriented Middleware
– Découpler le producteur des consommateurs

• Batch Orienté Tâche ou Worker
Horizontal Scaling
AMQP
Spring Integration

Exchange
Queue
Batch
AMQP
Spring Integration

pulling

Worker
Batch

Worker
Batch

Worker
Batch

Spring Batch

Spring Batch

Spring Batch
Monitoring
• Graphite http://graphite.wikidot.com
Monitoring
• Collectd
– http://collectd.org

– démon qui recueille périodiquement des
statistiques de performance du système

• JMXTrans
– https://github.com/jmxtrans/jmxtrans

– Interroge les données JMX de la JVM et les
envoyer dans Graphite
Monitoring
• Metrics
– http://metrics.codahale.com/

– Connaitre l’intérieur de votre application
– Gauges, Counters, Meters, Histogram, Timers

• Extension pour Spring Batch
– https://github.com/obazoud/metrics-spring-batch
– Disponible sur Maven Central
Monitoring

Mode push au lieu de pull
Monitoring
Spring Batch Admin
Spring Batch Admin
• Console Web pour Spring Batch
–
–
–
–
–

« Standalone » ou « Embedded »
API Rest
Uploader une configuration, un fichier à traiter
« Customisable »
Informations sur les jobs, steps, …
Spring Batch Admin
Conclusion
Les notions de bases
❏ Job, Step
❏ Reader, Processor, Writer
Les notions avancées
❏ Robustesse, Scaling, Monitoring
#NoXML
Questions
Crédits
Slides http://www.slideshare.net/obazoud/presentations
Auteurs (des éditions précédentes)
○
○

Olivier Bazoud
Julien Jakubowski

WS User Group - Spring Batch - Xebia