En arquitecturas distribuidas orientadas a servicios, el patrón Backend for Frontend (BFF) —popularizado inicialmente por Sam Newman— surge como respuesta a la tensión constante entre dos necesidades opuestas:
- La necesidad del backend de exponer servicios genéricos, cohesivos y centrados en el dominio del negocio.
- La necesidad del frontend (web, apps móviles, kioscos o integraciones B2B) de consumir payloads compactos, agregados y optimizados para una interfaz de usuario o dispositivo específico.
Intentar resolver ambas demandas con una única capa de "API pública compartida" suele derivar en dos problemas clásicos: sobrecarga de red en dispositivos móviles (over-fetching / under-fetching) o endpoints acoplados a vistas particulares que terminan degradando el diseño de los microservicios core.
1. El Problema: La API Única de Propósito General
Imaginemos un flujo omnicanal estándar (por ejemplo, el detalle de un cliente en checkout o CRM):
- App Móvil: Requiere renderizar rápido en conexiones 4G/5G inestables. Necesita el nombre del cliente, su saldo de puntos y los 3 últimos pedidos. Quiere un payload mínimo (< 10 KB) en una sola llamada HTTP/2.
- Portal Web Desktop: Dispone de mayor ancho de banda y pantalla. Necesita además el historial completo de facturación, direcciones fiscales guardadas y preferencias de notificación.
¿Qué ocurre sin un BFF?
- Estrategia "Un microservicio por vista": El cliente móvil realiza 4 o 5 llamadas encadenadas (
/users/{id},/loyalty/{id},/orders?limit=3,/discounts). Esto multiplica la latencia por la suma del RTT (Round Trip Time) de cada conexión sobre redes móviles. - Estrategia "Endpoint monolítico multipropósito": Se crea un endpoint en el backend central que devuelve todo. El móvil descarta el 70% de los datos recibidos (over-fetching), consumiendo batería y cuota de datos innecesariamente.
2. Topología de la Solución: BFF + API Gateway
El patrón BFF introduce una capa intermedia donde cada experiencia de usuario tiene su propio backend de consumo, mantenido idealmente por el mismo equipo que construye la interfaz cliente.
flowchart TD
subgraph Clients ["Clientes"]
App["App Móvil (iOS / Android)"]
Web["Web SPA (Desktop)"]
Pos["Kiosco / POS"]
end
subgraph Edge ["Perímetro"]
Gateway["API Gateway (e.g., Kong)"]
end
subgraph BFF_Layer ["Capa BFF"]
BFF_Mobile["BFF Móvil (Node.js / Go)"]
BFF_Web["BFF Web (Node.js / Go)"]
end
subgraph Core_Services ["Servicios Core"]
S1["Customer Service"]
S2["Loyalty / Points Service"]
S3["Order Service"]
end
App --> Gateway
Web --> Gateway
Pos --> Gateway
Gateway -->|/api/v1/mobile/*| BFF_Mobile
Gateway -->|/api/v1/web/*| BFF_Web
Gateway -->|/api/v1/pos/*| S3
BFF_Mobile --> S1
BFF_Mobile --> S2
BFF_Mobile --> S3
BFF_Web --> S1
BFF_Web --> S2
BFF_Web --> S3

