Arquitectura 10 min de lectura

Comunicación entre Sistemas

Publicado el 8 de diciembre de 2025

Comunicación entre Sistemas

En el mundo de la arquitectura de software moderna, una de las decisiones más críticas que debes tomar es cómo se comunican tus sistemas entre sí. No es solo una cuestión técnica; es una decisión que afecta el rendimiento, la escalabilidad, la mantenibilidad y la experiencia del usuario.

He trabajado con múltiples formas de comunicación entre sistemas: REST, GraphQL, WebSockets, gRPC y Message Brokers. Cada una tiene su lugar, y elegir la incorrecta puede convertir un proyecto prometedor en una pesadilla de latencia y complejidad.

El problema fundamental

Cuando construyes sistemas distribuidos, los componentes necesitan comunicarse. Pero no todas las comunicaciones son iguales. Algunas requieren respuestas inmediatas, otras pueden ser asíncronas. Algunas transportan datos pequeños, otras grandes volúmenes. Algunas necesitan garantías de entrega, otras pueden tolerar pérdidas.

Entender estas diferencias es la clave para elegir el protocolo correcto.

REST: El estándar universal

REST (Representational State Transfer) es probablemente el protocolo más común para comunicación entre sistemas. Es simple, estándar y funciona sobre HTTP, lo que lo hace compatible con prácticamente cualquier tecnología.

Cuándo usar REST

REST es ideal cuando:

  • Necesitas simplicidad: Es fácil de entender, implementar y depurar.
  • Trabajas con recursos estándar: CRUD (Create, Read, Update, Delete) sobre recursos es el caso de uso perfecto.
  • Necesitas compatibilidad amplia: Cualquier cliente HTTP puede consumir tu API.
  • El volumen de datos es moderado: REST funciona bien para la mayoría de casos de uso.

Ventajas de REST

  • Universal: Funciona con cualquier lenguaje y framework.
  • Cacheable: HTTP tiene mecanismos de caché incorporados.
  • Stateless: Cada petición es independiente, facilitando la escalabilidad.
  • Fácil de depurar: Puedes usar herramientas como Postman o curl.

Desventajas de REST

  • Overfetching y Underfetching: Puedes obtener más datos de los necesarios o necesitar múltiples peticiones.
  • Latencia: Cada petición requiere un round-trip completo.
  • Sin soporte nativo para streaming: No está diseñado para datos en tiempo real.

Ejemplo práctico

Para APIs públicas estándar, REST es ideal:

// Obtener un curso
GET /api/courses/123

// Crear un nuevo curso
POST /api/courses
{
  "title": "Arquitectura de Software",
  "description": "..."
}

Es simple, predecible y funciona perfectamente para operaciones CRUD.

GraphQL: Flexibilidad sobre el wire

GraphQL resuelve uno de los problemas principales de REST: la necesidad de hacer múltiples peticiones o recibir más datos de los necesarios.

Cuándo usar GraphQL

GraphQL es ideal cuando:

  • Tienes clientes con necesidades diferentes: Un móvil necesita menos datos que un desktop.
  • Quieres reducir el número de peticiones: Una sola query puede obtener datos de múltiples recursos.
  • Tus clientes necesitan control sobre los datos: Pueden especificar exactamente qué campos necesitan.

Ventajas de GraphQL

  • Flexibilidad: El cliente define qué datos necesita.
  • Menos round-trips: Una query puede obtener datos de múltiples recursos.
  • Tipado fuerte: El schema define exactamente qué es posible.
  • Herramientas excelentes: GraphQL Playground, Apollo DevTools.

Desventajas de GraphQL

  • Complejidad: Más difícil de implementar y mantener que REST.
  • Overhead de parsing: El servidor debe parsear y validar queries complejas.
  • Caché más complejo: HTTP caching no funciona tan bien como con REST.
  • Riesgo de queries complejas: Un cliente puede hacer queries que sobrecargan el servidor.

Ejemplo práctico

En un sistema de e-commerce, en lugar de hacer múltiples peticiones REST:

query {
  user(id: "123") {
    name
    email
    orders {
      id
      total
      items {
        product {
          name
          price
        }
      }
    }
  }
}

Una sola query obtiene todo lo necesario.

WebSockets: Comunicación en tiempo real

WebSockets proporcionan comunicación bidireccional persistente entre cliente y servidor. A diferencia de REST o GraphQL, que son request-response, WebSockets permiten que el servidor envíe datos al cliente sin que este lo solicite.

Cuándo usar WebSockets

WebSockets son ideales cuando:

  • Necesitas datos en tiempo real: Chat, notificaciones, actualizaciones en vivo.
  • El servidor debe iniciar la comunicación: El servidor necesita enviar datos sin esperar una petición.
  • Tienes comunicación frecuente: Múltiples mensajes pequeños son más eficientes que múltiples peticiones HTTP.

Ventajas de WebSockets

  • Baja latencia: Una vez establecida la conexión, la comunicación es instantánea.
  • Bidireccional: El servidor puede enviar datos cuando los tiene disponibles.
  • Eficiente: No hay overhead de headers HTTP en cada mensaje.

Desventajas de WebSockets

  • Complejidad de estado: Mantener conexiones abiertas requiere gestión de estado.
  • Escalabilidad: Es más difícil escalar WebSockets que REST stateless.
  • No funciona bien con proxies: Algunos proxies y firewalls bloquean conexiones WebSocket.

Ejemplo práctico

Para notificaciones en tiempo real, WebSockets son ideales:

// Cliente se conecta
const ws = new WebSocket('wss://api.invitex.com/notifications');

// Servidor envía notificación sin que el cliente la solicite
ws.onmessage = (event) => {
  const notification = JSON.parse(event.data);
  // Mostrar notificación al usuario
};

gRPC: Velocidad binaria

gRPC es un framework de RPC (Remote Procedure Call) desarrollado por Google. Usa Protocol Buffers para serialización binaria, lo que lo hace extremadamente eficiente.

Cuándo usar gRPC

gRPC es ideal cuando:

  • Necesitas máximo rendimiento: La serialización binaria es más rápida que JSON.
  • Trabajas con microservicios: La comunicación interna entre servicios se beneficia de gRPC.
  • Tienes contratos bien definidos: Protocol Buffers proporcionan contratos fuertemente tipados.
  • Necesitas streaming: gRPC soporta streaming bidireccional nativo.

Ventajas de gRPC

  • Rendimiento: Serialización binaria es más rápida que JSON.
  • Tipado fuerte: Los contratos están definidos en .proto files.
  • Streaming nativo: Soporta streaming unidireccional y bidireccional.
  • Multiplataforma: Funciona en cualquier lenguaje que soporte gRPC.

Desventajas de gRPC

  • No funciona en navegadores: Los navegadores no soportan gRPC directamente (aunque gRPC-Web existe).
  • Menos legible: Los mensajes binarios no son legibles como JSON.
  • Curva de aprendizaje: Requiere entender Protocol Buffers y el ecosistema gRPC.

Ejemplo práctico

En mi sistema de almacenamiento en Go, uso gRPC para comunicación interna entre microservicios:

// Definición del servicio en .proto
service StorageService {
  rpc UploadFile(stream Chunk) returns (UploadResponse);
  rpc DownloadFile(FileRequest) returns (stream Chunk);
}

// Uso en Go
client := storagepb.NewStorageServiceClient(conn)
stream, err := client.UploadFile(ctx)

La eficiencia de gRPC es crucial cuando estás moviendo grandes volúmenes de datos entre servicios.

Message Brokers: Comunicación asíncrona

Message Brokers como RabbitMQ o Kafka permiten comunicación asíncrona entre sistemas. Los productores envían mensajes a colas o topics, y los consumidores los procesan cuando están listos.

Cuándo usar Message Brokers

Message Brokers son ideales cuando:

  • Necesitas desacoplamiento: Los sistemas no necesitan conocerse directamente.
  • Puedes tolerar latencia: Los mensajes se procesan cuando el consumidor está disponible.
  • Necesitas garantías de entrega: Los brokers pueden garantizar que los mensajes se entreguen.
  • Tienes cargas de trabajo variables: Los consumidores pueden procesar mensajes a su ritmo.

RabbitMQ vs. Kafka

RabbitMQ es ideal para:

  • Colas de tareas (task queues)
  • Comunicación punto a punto
  • Garantías de entrega inmediata
  • Sistemas más simples

Kafka es ideal para:

  • Event streaming
  • Alta throughput
  • Retención de mensajes
  • Sistemas distribuidos complejos

Ventajas de Message Brokers

  • Desacoplamiento: Los sistemas no necesitan conocerse.
  • Escalabilidad: Puedes agregar más consumidores para procesar más mensajes.
  • Resiliencia: Los mensajes se persisten y pueden ser reprocesados.
  • Garantías de entrega: Los brokers garantizan que los mensajes se entreguen.

Desventajas de Message Brokers

  • Complejidad operacional: Requieren infraestructura adicional.
  • Latencia: La comunicación no es instantánea.
  • Posible duplicación: Los mensajes pueden ser procesados múltiples veces (at-least-once delivery).

Ejemplo práctico

En un sistema de e-commerce, uso RabbitMQ para procesar pedidos de manera asíncrona:

// Productor: cuando un usuario hace un pedido
await channel.sendToQueue('order-processing', {
  orderId: '123',
  userId: '456',
  items: [...]
});

// Consumidor: procesa el pedido cuando está disponible
channel.consume('order-processing', async (msg) => {
  const order = JSON.parse(msg.content.toString());
  await processOrder(order);
  channel.ack(msg);
});

El usuario no tiene que esperar a que se procese el inventario, se envíe el email de confirmación y se actualice la base de datos. Todo eso sucede de manera asíncrona.

Comparación rápida

ProtocoloLatenciaComplejidadCaso de uso principal
RESTMediaBajaAPIs estándar, CRUD
GraphQLMediaMediaAPIs flexibles, múltiples clientes
WebSocketsBajaMediaTiempo real, bidireccional
gRPCMuy bajaAltaMicroservicios, alto rendimiento
Message BrokersVariableAltaProcesamiento asíncrono

Casos de uso prácticos

REST para APIs públicas

Para APIs públicas, REST es ideal. Es simple, estándar y cualquier cliente puede consumirla fácilmente. Para operaciones CRUD estándar, REST es perfecto.

gRPC para comunicación interna

Para comunicación entre microservicios, gRPC es excelente. La eficiencia de la serialización binaria es crucial cuando estás moviendo grandes volúmenes de datos. Además, los contratos fuertemente tipados previenen errores en tiempo de ejecución.

WebSockets para tiempo real

Para notificaciones en tiempo real, WebSockets son ideales. Cuando un usuario recibe una notificación, no tiene que refrescar la página; la notificación aparece instantáneamente.

RabbitMQ para tareas asíncronas

En sistemas de e-commerce, RabbitMQ es perfecto para procesar pedidos, enviar emails y actualizar inventarios de manera asíncrona. Esto permite que la respuesta al usuario sea instantánea, mientras que las tareas pesadas se procesan en segundo plano.

Mejores prácticas

1. Elige según el caso de uso

No hay un protocolo “mejor”. Cada uno tiene su lugar:

  • REST: Para la mayoría de APIs públicas
  • GraphQL: Cuando los clientes necesitan flexibilidad
  • WebSockets: Para comunicación en tiempo real
  • gRPC: Para comunicación interna de alto rendimiento
  • Message Brokers: Para procesamiento asíncrono

2. Considera la latencia

Si la latencia es crítica (como en sistemas de trading o juegos), gRPC o WebSockets son mejores que REST. Si puedes tolerar latencia (como en procesamiento de pedidos), Message Brokers son una excelente opción.

3. Diseña para el cambio

Los protocolos pueden cambiar. Diseña tu sistema de manera que cambiar de REST a gRPC, o agregar un Message Broker, no requiera reescribir todo.

4. Implementa observabilidad

Independientemente del protocolo que uses, implementa logging, métricas y tracing. Cuando algo falla en un sistema distribuido, necesitas poder rastrear el problema a través de múltiples servicios.

5. Maneja errores gracefully

Los sistemas distribuidos fallan. Diseña tu sistema para manejar timeouts, conexiones perdidas y servicios no disponibles. Implementa retries, circuit breakers y fallbacks.

Mi perspectiva personal

Después de trabajar con todos estos protocolos, he llegado a una conclusión clara: la elección del protocolo de comunicación es tan importante como la arquitectura del sistema.

He visto proyectos que usaron REST para todo, incluso cuando necesitaban comunicación en tiempo real, resultando en polling constante que sobrecargaba los servidores. He visto proyectos que usaron WebSockets cuando REST habría sido suficiente, añadiendo complejidad innecesaria.

La clave es entender las necesidades reales de tu sistema:

  • ¿Necesitas respuestas inmediatas? REST o gRPC.
  • ¿Necesitas que el servidor inicie la comunicación? WebSockets.
  • ¿Puedes procesar de manera asíncrona? Message Brokers.
  • ¿Los clientes necesitan control sobre los datos? GraphQL.

En la práctica, usa REST para la mayoría de operaciones porque es simple y suficiente. Usa gRPC cuando el rendimiento es crítico. Usa WebSockets para notificaciones cuando la experiencia en tiempo real es importante.

No hay una respuesta única. La mejor comunicación entre sistemas es la que se adapta a las necesidades reales de tu aplicación, no la que está de moda o la que es técnicamente más impresionante.

Al final del día, lo que importa es que tus sistemas se comuniquen de manera eficiente, confiable y mantenible. Y eso requiere entender las fortalezas y debilidades de cada opción, y elegir la correcta para cada caso de uso específico.