Saltar al contenido principal
Volver a insights

Caso técnico · Ingeniería backend

Go en producción

Lo que aprendí operando una API Go con carga real y las decisiones que mantuvieron bajo control la latencia, el costo y la confiabilidad.

Este backend nació para un dominio sensible de hospitalidad digital en un entorno hospitalario. La plataforma integra servicios externos, streaming protegido y un backoffice con control granular. El resultado no vino de un truco aislado, sino de límites explícitos, observabilidad útil y decisiones operativas consistentes.

Escala observada en producción

peticiones por mes
20M+
latencia media reportada
6 ms
cache hit rate
92%
commits en el backend
1k+

Visión del sistema

Una arquitectura con degradación controlada

Cada dependencia tiene un timeout, un límite y una alternativa operativa. El objetivo no es impedir todo fallo, sino evitar que un fallo local se convierta en una indisponibilidad sistémica.

Borde HTTP
API Go / Fiber
Redis + caché local
PostgreSQL
Servicios externos
Prometheus

01 · Contexto

La carga real cambia las preguntas

En laboratorio, el throughput suele dominar la conversación. En producción, la previsibilidad y la capacidad de explicar el comportamiento importan tanto como la velocidad.

  • Integraciones externas con latencias y errores fuera de nuestro control.
  • Un área administrativa con sesión por cookie y permisos explícitos.
  • Observabilidad suficiente para diagnosticar causas y no solo síntomas.
  • Caché híbrida que reduce costo sin convertir Redis en un punto único de fallo.

02 · Arquitectura

Límites antes que escala

El arranque define el espacio operativo: pools, timeouts, concurrencia y health checks se configuran antes de aceptar la primera petición.

  • GOMAXPROCS y garbage collection ajustados con perfiles reales de CPU y memoria.
  • Pool PostgreSQL con límites explícitos de apertura, inactividad y vida útil.
  • Servidor HTTP con body limit, buffers y timeouts finitos.
  • Readiness que impide recibir tráfico antes de que las dependencias esenciales estén listas.
Una cola infinita no es resiliencia. Ante un pico, rechazar pronto y recuperarse rápido es mejor que acumular trabajo hasta colapsar.

03 · Rendimiento

El camino crítico debe ser simple

La mayor parte de la mejora vino de eliminar trabajo, controlar asignaciones e impedir que dependencias lentas ocuparan recursos indefinidamente.

  • Serialización eficiente, validación en la frontera y buffers reutilizables.
  • Clientes HTTP compartidos, pooling de conexiones y timeout por etapa.
  • Compresión y ETag solo cuando el costo total justificaba el beneficio.
  • Medición por ruta para optimizar a partir de evidencia de producción.

04 · Caché

La caché es una estrategia de disponibilidad

Redis reduce el read path, pero no debe controlar por sí solo la disponibilidad. El diseño incluye fallback local limitado y TTLs acordes con la volatilidad de los datos.

  • Redis como capa principal, con TTL e invalidación explícitos.
  • Caché local limitada para respuestas esenciales durante inestabilidad.
  • Claves versionadas y métricas de hit, miss, error y latencia.
  • Eviction previsible para impedir crecimiento silencioso de memoria.
Cuando Redis falla, la plataforma debe perder capacidad, no desaparecer.

05 · Observabilidad

Las métricas deben responder preguntas

Los dashboards fueron diseñados a partir de decisiones operativas: ¿debemos escalar, limitar, revertir o investigar una dependencia?

  • Histogramas de latencia y resultados por ruta normalizada.
  • Tamaño de request y response para detectar payloads anómalos.
  • Señales del runtime: CPU, heap, goroutines y pausas de GC.
  • SLOs y alertas orientados al impacto, sin ruido imposible de accionar.
Normalizar parámetros de ruta evitó cardinalidad descontrolada y mantuvo Prometheus utilizable durante incidentes.

06 · Seguridad

Controles cerca de la frontera

El área administrativa usa sesiones protegidas y RBAC explícito. La autorización permanece en el servidor, cerca de la operación que protege.

  • Cookies HttpOnly, Secure y SameSite adaptadas al flujo.
  • Permisos declarativos y auditoría para operaciones sensibles.
  • Límites de payload y validación antes de la lógica de negocio.
  • Herramientas de diagnóstico expuestas solo en entornos controlados.

07 · Incidentes

Los errores que cambiaron el diseño

Los patrones más fuertes surgieron de fallos observados. Cada incidente se convirtió en un cambio verificable, no solo en documentación.

  • La cardinalidad de métricas llevó a normalizar labels obligatoriamente.
  • La dependencia total de Redis llevó a un fallback local limitado.
  • Los retries sin presupuesto llevaron a backoff, jitter y límites.
  • El logging excesivo llevó a muestreo y niveles según el entorno.

08 · Checklist

Lo que verificaría antes del próximo deploy

El rendimiento sostenible es una propiedad de todo el sistema y debe estar protegido por automatización.

  • Timeouts, pools y body limits cubiertos por pruebas de contrato.
  • Caché con fallback, TTL, eviction y telemetría verificables.
  • Rutas normalizadas y alertas vinculadas a SLOs claros.
  • Readiness, rollback y prueba de carga representativa antes del release.

La arquitectura debe funcionar fuera del diagrama

¿Hablamos de un sistema que debe resistir producción?

Puedo ayudar a convertir requisitos de escala, confiabilidad y costo en decisiones de ingeniería medibles.

Hablar del proyectoRoberto Moraes · Ingeniero de Software & Gerente de TI