BFF (Backend para Frontend)

Integración Empresarial Jan 6, 2025 JAVASCRIPT

Definición

Imagina que tienes un restaurante con dos tipos de clientes: oficinistas que almuerzan rápido y familias que cenan tranquilamente. Podrías darles el mismo menú, pero sería ineficiente - los oficinistas quieren opciones rápidas y ejecutivas, las familias quieren menús infantiles y postres para compartir. La solución: dos menús diferentes optimizados para cada tipo de cliente. Un BFF hace exactamente esto para tus APIs.

BFF significa “Backend For Frontend” - un servidor backend dedicado que actúa como intermediario entre tu frontend específico y tus servicios de backend. En lugar de que tu app móvil llame directamente a 10 microservicios diferentes para mostrar una pantalla, llama a un único BFF móvil que orquesta esas llamadas, agrega los datos, y devuelve exactamente lo que la app necesita en un formato optimizado para móvil.

¿Por qué no una API genérica para todos? Porque cada frontend tiene necesidades diferentes. Una app móvil en 3G necesita respuestas pequeñas y agregadas. Una aplicación web puede manejar más datos y hacer más llamadas paralelas. Un dashboard de admin necesita información completamente diferente. Un BFF te permite optimizar la experiencia para cada cliente sin comprometer a los demás.

Ejemplo

E-commerce con App Móvil y Web: La página de inicio en web muestra 20 productos con imágenes grandes, reseñas completas y recomendaciones personalizadas. La app móvil muestra 5 productos con thumbnails y puntuación. Un BFF web devuelve datos completos; el BFF móvil devuelve solo lo esencial, ahorrando ancho de banda y batería.

Netflix y sus Múltiples Dispositivos: Netflix tiene apps para Smart TVs, móviles, tablets, consolas y web. Cada dispositivo tiene capacidades diferentes (resolución, memoria, conectividad). Los BFFs de Netflix adaptan las respuestas: el BFF de TV devuelve menos metadatos pero más datos de streaming; el BFF móvil optimiza para conexiones variables.

App Bancaria con Dashboard Web: La app móvil del banco muestra saldo, últimas 5 transacciones, y acciones rápidas (transferir, pagar). El dashboard web muestra análisis completos, gráficas históricas, y herramientas de gestión. Dos BFFs alimentando la misma base de datos pero devolviendo respuestas completamente diferentes.

Plataforma de Delivery con Tres Interfaces: La app del cliente muestra restaurantes y tracking. La app del repartidor muestra rutas y pedidos pendientes. El panel del restaurante muestra órdenes entrantes y gestión de menú. Tres BFFs diferentes consultando los mismos microservicios pero presentando vistas completamente distintas.

Analogía

El Menú del Restaurante Personalizado: La misma cocina (backend) prepara los platos, pero hay menús diferentes para diferentes situaciones: menú ejecutivo para oficinistas (rápido, compacto), menú familiar para domingos (con opciones infantiles), carta de vinos para cenas especiales. Cada menú presenta la misma cocina de forma optimizada para el contexto.

El Traductor Especializado: Un documento técnico necesita diferentes traducciones: una versión simplificada para el público general, una técnica para especialistas, y un resumen ejecutivo para directivos. El contenido base es el mismo, pero cada “traducción” está optimizada para su audiencia.

El Guía Turístico Adaptativo: El mismo museo ofrece diferentes tours: uno rápido de 30 minutos para turistas con poco tiempo, uno detallado de 3 horas para entusiastas, uno interactivo para familias con niños. El museo (backend) es el mismo, pero la experiencia (API) se adapta al visitante.

El Servicio de Catering con Diferentes Formatos: El catering puede servir el mismo menú como buffet (web - todo disponible, el cliente elige), platos individuales servidos (móvil - porciones precisas, servicio optimizado), o degustación con maridaje (dashboard premium - experiencia completa con extras).

Code Example


// Sin BFF: App móvil hace múltiples llamadas
// GET /api/users/123
// GET /api/users/123/orders
// GET /api/users/123/preferences
// GET /api/users/123/notifications
// 4 llamadas = 4 round-trips = lento en móvil

// Con BFF Móvil: una llamada optimizada
// GET /api/mobile-bff/users/123/home
{
  "user": { "id": 123, "name": "Ana", "avatar": "thumb_url" },
  "recentOrders": [/* solo los 3 últimos */],
  "unreadNotifications": 5,
  "quickActions": ["transfer", "pay", "request"]
}

// BFF Web: datos más ricos para desktop
// GET /api/web-bff/users/123/dashboard
{
  "user": { /* perfil completo con todos los campos */ },
  "orders": [/* paginados, 20 items con detalles */],
  "preferences": { /* todas las configuraciones */ },
  "analytics": { /* datos para gráficas */ },
  "recommendations": [/* productos sugeridos */]
}

// Implementación del BFF
class MobileBFF {
  async getUserHome(userId) {
    // Orquestar múltiples llamadas a microservicios en paralelo
    const [user, orders, prefs, notifications] = await Promise.all([
      userService.getUser(userId),
      orderService.getRecentOrders(userId, { limit: 3 }),
      preferenceService.getEssentials(userId),
      notificationService.getUnreadCount(userId)
    ]);

    // Transformar a formato optimizado para móvil
    return {
      user: this.simplifyUser(user),
      recentOrders: orders.map(o => this.minimalOrder(o)),
      unreadNotifications: notifications.count,
      quickActions: this.getQuickActions(prefs)
    };
  }

  simplifyUser(user) {
    // Solo campos necesarios para móvil
    return {
      id: user.id,
      name: user.firstName,
      avatar: user.avatarThumbnail // URL de imagen pequeña
    };
  }

  minimalOrder(order) {
    return {
      id: order.id,
      status: order.status,
      total: order.total,
      itemCount: order.items.length
      // Omitir: detalles de items, direcciones, historial...
    };
  }
}

Standards & RFCs

Standards & RFCs
1)- Sam Newman - Backend For Frontend Pattern (artículo original)
2)- Microsoft Azure Architecture - Backends for Frontends Pattern
3)- GraphQL Specification - Alternativa común al patrón BFF