Marcio Cunha

Cómo depurar latencia y caos en peticiones HTTP con Toxiproxy

Aprende a inyectar fallos de red, latencia severa y pérdida de paquetes en entornos de prueba usando Toxiproxy para validar sistemas distribuidos.

Marcio Cunha•4 min
También disponible en:PortuguêsEnglish
Resumen
  • La inyección de retrasos artificiales en conexiones TCP simula escenarios reales de inestabilidad sin alterar el código fuente de la aplicación.
  • Separar la API de control del proxy de datos permite automatizar fallas directamente dentro de flujos de integración continua.
  • Los sistemas distribuidos modernos deben degradarse de forma elegante ante caídas parciales de red en lugar de colapsar por completo.
  • Combinar herramientas de simulación de red con auditorías profundas utilizando Ncat garantiza una mayor robustez operativa.
  • Una validación estricta de timeouts evita que las conexiones pendientes agoten los recursos computacionales del backend.

¿Por qué falla tu aplicación cuando la red se vuelve lenta?

Cuando desarrollamos software en ordenadores veloces conectados a redes locales ultrarrápidas, todo parece marchar a la perfección. Sin embargo, el mundo real es implacable: los servidores en la nube sufren de congestión en internet, los cables submarinos se rompen y las conexiones móviles fluctúan sin cesar. En la práctica, esto significa que tu aplicación debe gestionar retrasos e interrupciones sin corromper datos ni congelar la interfaz de usuario. Probar estos escenarios desfavorables de forma controlada solía ser complejo, requiriendo cambios manuales en enrutadores o cortafuegos.

Para resolver este problema sin fricciones, los ingenieros recurren a herramientas de ingeniería del caos en la capa de red. Aquí es donde entra Toxiproxy, una utilidad fantástica creada por Shopify que actúa como un intermediario inteligente entre tu aplicación y bases de datos o servicios externos. En lugar de alterar la infraestructura física, levantas un proxy local que intercepta el tráfico y aplica reglas de degradación artificial, permitiendo observar exactamente cómo se comporta tu código bajo estrés operativo.

Qué es Toxiproxy y cómo funciona en la práctica

Toxiproxy se compone esencialmente de dos partes: una aplicación ligera escrita en Go que administra conexiones TCP y una API HTTP que permite alterar el comportamiento de dichas conexiones en tiempo de ejecución. Al iniciar Toxiproxy, este abre un puerto fingiendo ser tu servicio real, como una base de datos PostgreSQL. Tu aplicación se conecta a este puerto de Toxiproxy en lugar de ir directo al servidor. En la práctica, cualquier paquete de datos que pase por ahí puede sufrir retrasos, corromperse o simplemente perderse.

Este enfoque modular transforma por completo la manera en que creamos pruebas de integración automatizadas. En lugar de depender de la suerte para detectar un error de tiempo de espera en producción, programas tu entorno de pruebas para inyectar intencionalmente doscientos milisegundos de latencia durante un proceso de pago. Para garantizar que el tráfico permanezca transparente durante estas pruebas de estrés, los equipos de ingeniería suelen combinar estas simulaciones con inspecciones profundas de paquetes, tal como inspeccionar tráfico de red corrupto con eBPF en entornos Linux de alto rendimiento.

Configurando Toxiproxy con Docker Compose

La forma más limpia y rápida de ejecutar Toxiproxy en tu máquina de desarrollo o servidor de integración es usando Docker. Podemos crear un archivo de configuración sencillo que levante tanto la herramienta como un servicio ficticio para pruebas. A continuación, mostramos un ejemplo práctico de configuración para desplegar Toxiproxy junto con una aplicación backend.

version: '3.8'
services:
  toxiproxy-server:
    image: shopify/toxiproxy:latest
    ports:
      - "8474:8474"
      - "5433:5433"
    command: ["/toxiproxy-server", "--host=0.0.0.0"]
  app:
    image: my-backend-service:latest
    environment:
      - DB_HOST=toxiproxy-server
      - DB_PORT=5433
    depends_on:
      - toxiproxy-server

Con este archivo en marcha, el puerto 8474 queda libre para recibir comandos de alteración de tráfico, mientras que el puerto 5433 redirige los paquetes hacia el destino final configurado vía API. Esta separación garantiza que las pruebas ocurran de forma totalmente aislada, sin interferir con otros servicios de tu clúster o laboratorio doméstico.

Creando tu primer escenario de caos con toxics

En el vocabulario de Toxiproxy, las reglas de degradación de red se denominan "toxics". Puedes agregar toxics usando la interfaz de línea de comandos oficial o realizando peticiones HTTP directas a la API de control. Para demostrar cómo inyectar latencia y pérdida de paquetes, utilizaremos comandos prácticos ejecutados en la terminal de tu banco de pruebas.

Antes de aplicar cualquier regla de caos, debemos registrar la ruta que Toxiproxy supervisará, apuntando a la dirección original del servicio. Sigue los pasos a continuación para configurar el proxy e inyectar inestabilidad:

  1. Registra el proxy apuntando a tu base de datos real o servicio externo:
    curl -X POST http://localhost:8474/proxies -d '{"name": "database", "listen": "0.0.0.0:5433", "upstream": "192.168.1.50:5432"}'
  2. Añade un retraso artificial de quinientos milisegundos con una fluctuación de cien milisegundos:
    curl -X POST http://localhost:8474/proxies/database/toxics -d '{"type": "latency", "attributes": {"latency": 500, "jitter": 100}}'
  3. Simula una tasa de pérdida de paquetes del diez por ciento para probar la resiliencia de reintentos:
    curl -X POST http://localhost:8474/proxies/database/toxics -d '{"type": "timeout", "attributes": {"timeout": 1000}}'

Al ejecutar estos comandos, cualquier petición realizada al puerto 5433 sufrirá el impacto configurado de forma inmediata. Esto te permite evaluar en tiempo real si tus servicios reintentan las conexiones de manera segura o si colapsan debido al agotamiento de hilos.

Simular fallas de red de manera intencional dejó de ser un lujo reservado a grandes tecnológicas y se ha convertido en un requisito fundamental de ingeniería. Herramientas como Toxiproxy democratizan las pruebas de caos, permitiendo que cualquier desarrollador descubra fallas ocultas en su arquitectura antes de que lleguen a los usuarios en producción. Comprender exactamente cómo reacciona tu software ante retrasos severos garantiza aplicaciones mucho más estables y preparadas para cualquier imprevisto.

Invertir tiempo en crear escenarios de homologación robustos protege al negocio contra pérdidas financieras y reduce drásticamente el estrés del equipo de operaciones durante incidentes críticos. Combina estas prácticas de resiliencia con un monitoreo riguroso de consumo eléctrico — como cómo medir el consumo eléctrico de servidores con IPMI — y obtendrás una visión completa de la salud de tu infraestructura en los planos lógico y físico.