Backend for Frontend
Une API par expérience client : arrêter le compromis d'une seule API « qui sert tout le monde mal ».
Problème
Un hub EDI expose une API REST /orders commune au
portail web fournisseur (Next.js), à l'app mobile ops (React Native),
et au dashboard finance (Power BI). Chacun a des besoins
incompatibles : le portail veut le détail complet d'une commande
avec lignes ; l'app mobile veut un payload minimal compressé ; la
finance veut des agrégats trimestriels. Si l'API tente de tout
fournir, elle sur-livre pour mobile (latence) et sous-livre pour
finance (10 appels enchaînés). Si elle ajoute des paramètres
?include=lines&agg=quarter, elle devient un nœud
de complexité ingérable.
Forces
- Les contextes UX divergent. Mobile = bande passante limitée, écran petit. Desktop = données détaillées. Reporting = agrégats lourds.
- Les équipes diffèrent. Équipe portail = product + design ; équipe ops = SRE ; équipe finance = data engineers. Une seule API force des cycles de release joints.
- L'agrégation côté client est coûteuse. Mobile qui fait 12 appels pour construire une vue = batterie + latence.
- La sécurité diffère. Portail = OAuth fournisseur ; ops = SSO interne ; finance = MFA stricte. Politiques d'auth par consommateur.
Solution
Construire un BFF par expérience client. Le BFF Portail Fournisseur
expose GET /orders/:id qui agrège l'order service,
l'invoice service et l'audit service en un seul payload riche. Le
BFF Ops Mobile expose GET /alerts qui ne retourne que
les KPI temps réel filtrés par partenaire surveillé. Le BFF Finance
expose GET /revenue?period=quarter avec pre-aggregation
et cache long. Chaque BFF appartient à l'équipe qui livre la UI.
Les services internes (Order, Invoice, Routing) restent stables et
génériques.
Portail Fournisseur App Ops mobile Dashboard Finance
(Next.js / web) (React Native) (Tableau de bord)
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ BFF │ │ BFF Ops │ │ BFF Finance │
│ Fournisseur │ │ /alerts │ │ /kpis │
│ /orders │ │ /retries │ │ /revenue │
│ /invoices │ │ /backlog │ │ /aging │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────────────────────────┐
│ Services internes : Order, Invoice, Routing, Audit, ML │
└──────────────────────────────────────────────────────────┘
Implémentation EDI
Cas concret : un hub EDI multi-canal : portail fournisseur
web pour les industriels qui voient leurs INVOIC envoyés et leur
statut MDN ; app mobile pour les opérateurs qui voient les flux en
erreur à reprocesser ; dashboard direction pour les KPI métiers. Le
BFF Fournisseur traduit le modèle interne (INVOIC EDIFACT brute) en
payload domain-friendly (numéro de facture, statut humain). Le BFF
Ops priorise les exceptions du dead-letter-channel
avec contexte de retry. Le BFF Finance pré-calcule taux de
livraison à temps, DSO moyen, encours par partenaire. Les services
internes (parser EDIFACT, broker AS2, archive) restent inchangés.
Anti-patterns
- BFF qui devient un monolithe. Si toutes les UIs finissent par taper le même BFF avec des paramètres : on a réinventé l'API monolithique. Un BFF par UI, isolé.
- BFF qui contient de la business logic. Le BFF agrège et adapte, il ne crée pas. Si le calcul « est-ce qu'on relance ? » vit dans le BFF Ops et pas dans le service retry, la règle métier devient inconsistante entre clients.
- BFF par appareil au lieu de par expérience. Un BFF iOS, un BFF Android, un BFF Web qui font tous la même chose : duplication inutile. Un BFF par cas d'usage UX.
Patterns liés
- API Gateway : similaire mais plus générique ; le BFF est un Gateway spécialisé à une UI.
- Composed Message Processor — le BFF agrège souvent des messages hétérogènes pour ses appels.
- Content Enricher — la phase d'enrichissement souvent intégrée au BFF.
- Service Mesh — le maillage entre BFF et services internes.
Sources
- Newman S. — Pattern: Backends For Frontends, 2015 (article fondateur, ancien blog SoundCloud puis samnewman.io). samnewman.io/patterns/architectural/bff
- Newman S. — Building Microservices, O'Reilly, 2e éd. 2021. Chap. « User Interfaces » développe le pattern BFF. samnewman.io — Building Microservices
- Microsoft Architecture Center — Backends for Frontends pattern. learn.microsoft.com — BFF
- ThoughtWorks Tech Radar — BFF. Le pattern est passé de l'expérimental au « adopt » chez ThoughtWorks vers 2017. thoughtworks.com — Radar BFF