Enrichment Pipeline
La chaîne ordonnée d'enrichissements qui transforme un message parser brut en payload exploitable par le métier — chaque étape consulte un référentiel, ajoute un champ.
Problème
Un INVOIC EDIFACT contient des codes : GLN du fournisseur (3010234567890), GTIN du produit (0023456789012), BIC bancaire (BNPAFRPP). Pour l'ERP, ces codes sont opaques : il a besoin du nom du fournisseur, de l'adresse de facturation, du libellé produit, de la TVA applicable, de l'IBAN à créditer, du code pays, de la classification douanière HS. Si chaque consumer en aval (ERP, archive, lake) fait ses propres lookups, on duplique 5 fois les requêtes aux référentiels, on n'a pas une vue cohérente, et on couple chaque consumer aux schémas des référentiels.
Forces
- Les messages EDI sont volontairement codés. Optimisation taille historique, normalisation des identifiants.
- Les consumers ont besoin du décodé. L'utilisateur
final ne lit pas
3010234567890, il veut « Carrefour France SAS ». - Les référentiels sont la source de vérité. PIM, MDM, registre légal — un seul lookup centralisé.
- Les étapes ont des dépendances. Le calcul de TVA dépend du pays du fournisseur résolu en étape 1.
- Les référentiels peuvent être lents ou indisponibles. Le pipeline doit gérer le degraded mode.
Solution
Composer un pipeline d'Content
Enricher en étages ordonnés. Chaque étage prend en input le
message + les enrichissements précédents, fait son lookup, ajoute
son champ, passe au suivant. L'ordre suit les dépendances. Chaque
étage est testable indépendamment. La résilience est par étage :
si le PIM est down, on peut continuer avec un champ productLabel: null et flagger le message. Le pipeline
est versionné et observabilité par étape (latence, taux d'échec,
cache hit rate). Implémentations : Apache Camel routes, Kafka
Streams topology, AWS Step Functions, Temporal workflows.
INVOIC EDIFACT (brut, codes GLN seuls)
│
▼
┌──────────────────────────┐
│ 1. Enrich Partner GLN │ ─── lookup GLN → Partner master
│ + supplier name/addr │
└─────────┬────────────────┘
▼
┌──────────────────────────┐
│ 2. Enrich Product GTIN │ ─── lookup PIM
│ + label, weight, HS │
└─────────┬────────────────┘
▼
┌──────────────────────────┐
│ 3. Enrich Tax rates │ ─── lookup pays / produit
│ + VAT rate, code │
└─────────┬────────────────┘
▼
┌──────────────────────────┐
│ 4. Enrich BIC bank info │ ─── lookup BIC → IBAN validation
└─────────┬────────────────┘
▼
INVOIC enrichi → broker → ERP
Implémentation EDI
Cas concret : hub EDI hospitalier reçoit un message ORM-O01
HL7 v2.5 avec MRN et codes LOINC. Le pipeline d'enrichissement :
(1) MRN → identité patient depuis MPI (Master Patient Index) ; (2)
code LOINC → libellé examen depuis FHIR Terminology Server ; (3)
code ICD-10 du diagnostic → libellé clinique ; (4) prescripteur
NPI → coordonnées et spécialité ; (5) pharmacie destinataire →
adresse, formats supportés. Le message résultant est exploitable
par le HIS sans nouvelle lookup. Côté retail : ORDERS EDIFACT
avec GTIN seul, enrichi par PIM (GS1 GDSN) pour récupérer
libellé, poids, packaging, HS code, normes douanières. Camel
route :
from("kafka:edi.in").to("bean:partnerEnricher").to("bean:productEnricher").to("bean:taxEnricher").to("kafka:edi.enriched");
Chaque étape utilise un cache local (Caffeine) + cluster (Redis)
pour éviter les requêtes répétitives au référentiel maître.
Anti-patterns
- Enrichissement en aval, chez chaque consumer. Duplication des lookups, divergence des résultats si le référentiel change entre deux consumers.
- Étape bloquante synchrone sans timeout. Si le PIM mais 30s, le pipeline complet bloque.
- Sans cache. Le même GLN consulté 1 000 fois par seconde : requêtes inutiles, latence élevée.
- Sans gestion des trous. Si le GLN du fournisseur n'est pas dans le référentiel, on plante au lieu de flagger et router vers Dead Letter.
- Enrichment qui contient du métier. « Si pays = FR, taxer à 20% » dans l'enricher : c'est de la business logic à mettre dans un service dédié.
- Pipeline gigantesque. 20 étapes : latence et complexité. Regrouper les étapes logiquement liées.
Patterns liés
- Content Enricher — la brique unitaire du pipeline.
- Pipes and Filters — la topologie générale (chaîne d'étages).
- Validation Pipeline — pattern frère, à exécuter avant ou après l'enrichissement.
- Claim Check — pour les enrichissements lourds (photo produit), on stocke et référence.
- Composed Message Processor — variante structurée pour un message composite enrichi par lignes.
Sources
- Hohpe G., Woolf B. — Enterprise Integration Patterns, Addison-Wesley 2003. Content Enricher (EIP §336). enterpriseintegrationpatterns.com — DataEnricher
- GS1 — GDSN Global Data Synchronization Network. Le référentiel produit mondial pour enrichissement GTIN. gs1.org — GDSN
- FHIR Terminology Service. Le service de lookup pour LOINC, SNOMED, ICD-10 en healthcare. hl7.org — Terminology Service
- Apache Camel — Enricher EIP. Implémentation Java de référence. camel.apache.org — Content Enricher
- Confluent — Schema Registry + Stream enrichment. Le pattern Kafka Streams enricher classique. confluent.io — Streams concepts