Práctica: Construir un sistema de logs distribuido con streaming

Lectura
30 min~5 min lectura
Objetivo de la lección

Concepto clave En sistemas distribuidos modernos, la observabilidad es crucial para mantener servicios confiables.

Puntos de control
  • Concepto clave
  • Cómo funciona en la práctica
  • Caso de estudio
  • Errores comunes

Concepto clave

En sistemas distribuidos modernos, la observabilidad es crucial para mantener servicios confiables. Un sistema de logs distribuido con streaming permite recolectar, transmitir y analizar eventos de múltiples microservicios en tiempo real, usando gRPC como transporte eficiente. Imagina una red de sensores en una fábrica inteligente: cada máquina (microservicio) genera datos continuamente (logs), y un centro de control (servidor de logs) los recibe mediante tuberías de alta velocidad (streaming gRPC) para detectar fallos o tendencias al instante.

Este patrón supera las limitaciones de APIs REST tradicionales, donde cada solicitud de log sería una llamada HTTP separada, generando latencia y sobrecarga. Con streaming bidireccional de gRPC, estableces un canal persistente donde el cliente envía logs de forma asíncrona y el servidor puede incluso enviar confirmaciones o comandos de vuelta. Es como una llamada de video en lugar de mensajes de texto: comunicación continua y en ambos sentidos.

Cómo funciona en la práctica

Implementar este sistema implica definir un servicio gRPC con Protocol Buffers, configurar el streaming en el servidor y cliente, y manejar la concurrencia. Sigue estos pasos:

  1. Diseña el proto: Define un mensaje LogEntry con campos como timestamp, nivel (INFO, ERROR), servicio, y mensaje. Crea un servicio con un método StreamLogs que use stream en ambos lados (bidireccional).
  2. Implementa el servidor: En Go, Python o Java, crea un servidor gRPC que maneje el método StreamLogs. Usa hilos o goroutines para recibir logs del cliente y, opcionalmente, enviar acuses de recibo.
  3. Configura el cliente: Cada microservicio abre una conexión streaming al servidor de logs y envía entradas según ocurren eventos, sin bloquear su operación principal.
  4. Maneja errores: Implementa reconexión automática si el stream se cae, y usa buffers para logs no enviados durante interrupciones.

Ejemplo de datos en una tabla:

TimestampNivelServicioMensaje
2023-10-01 10:00:00INFOauth-serviceUsuario autenticado: ID 123
2023-10-01 10:00:05ERRORpayment-serviceFallo en transacción: saldo insuficiente

Caso de estudio

Una fintech con 50 microservicios migró de logs centralizados por batch a un sistema con gRPC streaming. Antes, los logs se acumulaban localmente y se enviaban cada hora, causando retrasos en la detección de fraudes. Ahora, cada servicio usa un cliente gRPC que envía logs inmediatamente a un servidor central. El servidor los procesa en tiempo real, aplicando reglas de alerta (ej., más de 5 errores en un minuto dispara una notificación).

Resultado: Tiempo de detección de incidentes reducido de 45 minutos a menos de 10 segundos, con un aumento del 30% en la eficiencia del ancho de banda gracias a la compresión de Protocol Buffers.

Implementación técnica: Usaron Go para el servidor, con un pool de workers que escriben logs en una base de datos de series de tiempo (como InfluxDB). Los clientes en Java y Python se configuraron con timeouts de 30 segundos y reintentos exponenciales en fallos de red.

Errores comunes

  • No limitar el rate de logs: Enviar demasiados logs puede saturar el servidor. Solución: Implementar throttling en el cliente, como un máximo de 100 logs por segundo, y usar niveles de log (solo ERROR en producción).
  • Ignorar la gestión de conexiones: Dejar streams abiertos indefinidamente sin monitoreo causa fugas de memoria. Solución: Usar heartbeats para detectar conexiones inactivas y cerrarlas después de un timeout.
  • No manejar backpressure: Si el servidor procesa más lento de lo que llegan logs, el cliente puede bloquearse. Solución: Configurar buffers con tamaño fijo y políticas de descarte (ej., descartar logs viejos si el buffer está lleno).
  • Olvidar el cifrado: Transmitir logs sensibles sin TLS expone datos. Solución: Siempre usar gRPC con TLS habilitado en entornos de producción.
  • No probar en condiciones de fallo: Asumir que la red siempre está estable lleva a crashes inesperados. Solución: Simular cortes de red y alta latencia en pruebas, usando herramientas como Chaos Mesh.

Checklist de dominio

  • Puedo diseñar un archivo .proto para un servicio de streaming de logs bidireccional.
  • Sé implementar un servidor gRPC que maneje múltiples streams concurrentes sin bloquearse.
  • He configurado un cliente que envía logs asíncronamente y maneja reconexiones automáticas.
  • Entiendo cómo medir y optimizar el rendimiento (ej., latencia, throughput) del streaming.
  • Puedo integrar el sistema con un backend de almacenamiento (como Elasticsearch o una base de datos).
  • Sé aplicar técnicas de resiliencia, como circuit breakers y retries, en el cliente.
  • He probado el sistema bajo carga alta y condiciones de fallo de red.

Implementa un cliente y servidor de logs con gRPC streaming bidireccional

En este ejercicio, construirás un sistema básico de logs distribuido usando gRPC. Sigue estos pasos:

  1. Define el Protocol Buffer: Crea un archivo logs.proto con un mensaje LogEntry que incluya campos para id (string), timestamp (int64), level (enum con INFO, WARN, ERROR), service (string), y message (string). Define un servicio LogService con un método StreamLogs que use stream LogEntry tanto para request como response (bidireccional).
  2. Genera el código: Usa el compilador de Protocol Buffers (protoc) para generar código en tu lenguaje preferido (ej., Go, Python, Java). Asegúrate de incluir plugins de gRPC.
  3. Implementa el servidor: Crea un servidor gRPC que escuche en el puerto 50051. En el método StreamLogs, recibe logs del cliente, imprímelos en consola con formato, y envía una respuesta de confirmación (ej., un mensaje con received: true) por cada log. Maneja múltiples clientes concurrentemente.
  4. Implementa el cliente: Desarrolla un cliente que simule un microservicio. Debe conectarse al servidor, abrir un stream, y enviar 10 logs de ejemplo con diferentes niveles y servicios, con un intervalo de 1 segundo entre ellos. Captura las respuestas del servidor y muéstralas.
  5. Prueba y mejora: Ejecuta el servidor y varios clientes simultáneamente para ver la concurrencia. Agrega manejo de errores: si el stream se cierra, reconecta después de 5 segundos.
Pistas
  • Usa goroutines en Go o asyncio en Python para manejar streams sin bloquear el servidor.
  • En el cliente, envía logs en un bucle separado del que recibe respuestas para evitar deadlocks.
  • Prueba con herramientas como BloomRPC o grpcurl para verificar el servicio antes de implementar el cliente completo.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Laboratorio de práctica

Antes de marcar esta lección como completa, escribí una evidencia breve para Implementación Avanzada de gRPC y Protocol Buffers para Microservicios: un ejemplo, una decisión, una captura, una mini demo o una nota que puedas reutilizar en portfolio.

Reflexión rápida

¿Qué cambiarías en tu forma de trabajar después de aplicar práctica: construir un sistema de logs distribuido con streaming?

De lección a portfolio

Convertí esta lección en una prueba técnica visible.

Una app pequeña publicada, con README y decisiones explicadas, funciona mejor que una lista de tecnologías sueltas.

Paso 1

Creá una demo mínima que use el concepto de la lección.

Paso 2

Escribí un README corto con objetivo, stack, decisión técnica y mejora futura.

Paso 3

Publicá la demo y enlazala desde tu perfil profesional.

Newsletter Cursalo

Recibí rutas y cursos nuevos

Sumate para recibir recursos orientados a empleo y portfolio.

  • Rutas de empleo
  • Cursos prácticos
  • Portfolio y entrevistas

Sin spam. También podés entrar con tu cuenta para guardar progreso. Iniciá sesión

Práctica: Construir un sistema de logs distribu... | CursaloFalar no WhatsApp