Retour aux projets
15 avr. 2026 Case Study

SpringBatch-ETL : Pipeline ETL Haute Performance

Migration massive MySQL → MySQL : 73M de lignes à ~1,8M lignes/min, avec un moteur de désérialisation binaire via protocole TCP.

Java 21Spring BatchSwooleTCP/IPDockerCloud-Ready
Architecture du pipeline SpringBatch

Optimisation des flux entre Java et le moteur de transformation

Le Défi

Lors de la migration de plateformes e-commerce legacy vers des systèmes modernes, le volume de données devient vite problématique. SpringBatch-ETL devait migrer 73 millions de lignes à ~1,8M lignes/min tout en gérant une contrainte technique spécifique : la désérialisation de données PHP.

Ces informations, stockées en base dans un format sérialisé propre à PHP, devaient être converties en structures JSON exploitables par Java en plein milieu du flux de migration, sans effondrer les performances du système.

Choix Techniques

Pourquoi Java 21 & Spring Batch ?

Le passage du HTTP au TCP

Au début du projet, j’envisageais de créer une API PHP classique pour déléguer la désérialisation. Cependant, la vitesse de traitement est immédiatement devenue un frein. Le protocole HTTP, bien que standard, impose un overhead (headers, handshake complexe) inadapté pour traiter des millions de requêtes unitaires à la volée.

Je suis donc passé sur un daemon Swoole communiquant directement via le protocole TCP. En éliminant les couches applicatives inutiles, j’ai obtenu un outil de désérialisation performant, capable d’encaisser, additionné au parallélisme de Spring Batch.

Le Problème : L’instabilité des scripts unitaires

Utiliser des scripts PHP isolés lancés en ligne de commande pour chaque ligne à transformer aurait transformé une migration de 2h en un processus de plus de 20h, à cause du temps de boot de l’interpréteur PHP à chaque appel.

La Solution : Micro-service Swoole & Parallélisme

J’ai conçu une architecture hybride où le moteur Java pilote la logique de données tout en déléguant la transformation brute :

Zoom Technique : Configuration Dynamique

Pour éviter de coder un Job spécifique pour chaque table, j’ai rendu le moteur entièrement générique via le fichier application.yml :

Ce que j’ai appris

Rétrospective & Futur

Ce projet a prouvé sa stabilité sur des migrations critiques en environnement Docker. Cependant, pour passer à l’échelle supérieure, je travaille sur une transition vers le Cloud.

L’objectif est de permettre un scaling horizontal complet : en déployant le moteur sur Kubernetes, je pourrai grâce au mapping déclaratif faire tourner plusieurs instances en parallèle, chacune traitant des tables différentes. Cette approche permettra de réduire drastiquement les temps de migration, même pour des bases de données de plusieurs centaines de millions de lignes.