03 · Automobile · Marketplace
Auto-Sélection : une marketplace automobile pensée pour l'échelle
Auto-Sélection réunit le stock de plus de 1 200 professionnels pour que l'acheteur compare les véhicules disponibles partout en France depuis une seule recherche. Chaque jour, le pipeline absorbe plus de 120 000 annonces, normalise les marques, modèles, versions et équipements, puis met à jour le catalogue et son index de recherche. Le même socle alimente les annonces, les cotes, les fiches techniques et un réseau de plus de 2 millions de pages.

// sous le capot
Architecture et décisions techniques
J'ai séparé l'application publique Laravel, le back-office Next.js et le worker d'ingestion. Les flux partenaires arrivent sur S3, le worker normalise le catalogue par lots, puis ne réindexe dans Meilisearch que les véhicules créés, modifiés ou retirés. Un Worker Cloudflare préserve en parallèle l'historique des URL avant que la requête n'atteigne Laravel.
- 01
Importer sans mettre le stock en danger
Chaque XML est téléchargé depuis S3 puis parcouru avec XMLReader sans être chargé en mémoire. Les véhicules sont traités par lots et les données inchangées sont ignorées. Un fichier vide ou une chute anormale du stock bloque la désactivation des annonces existantes.
- 02
Synchroniser seulement ce qui change
MySQL reste la source de vérité. Une fois l'import terminé, seuls les véhicules créés, modifiés ou retirés sont ajoutés ou supprimés dans Meilisearch. Les filtres restent rapides sans reconstruire tout l'index à chaque flux.
- 03
Un catalogue qui alimente tout le réseau
Annonces, marques, modèles, villes, catégories, cotes et fiches techniques s'appuient sur les mêmes références normalisées. Une correction de marque ou de modèle se propage ainsi à la recherche comme aux pages publiques.
- 04
Préserver l'historique des URL à la périphérie
Le Worker Cloudflare intercepte les anciennes routes, les sous-domaines de villes et de marques, les fiches et les extensions PHP ou HTML avant Laravel. Il normalise la requête, consulte les correspondances dans KV et renvoie vers la destination attendue ; sans correspondance, il transmet la requête à l'origine. Les anciennes URL conservent ainsi leur destination sans charger l'application.