Marcio Cunha

Cómo simular pérdida de paquetes en microservicios

Aprenda a utilizar herramientas de inyección de latencia y pérdida de paquetes en entornos de prueba para validar la resiliencia de microservicios.

Marcio Cunha•4 min
También disponible en:PortuguêsEnglish
Resumen
  • La simulación controlada de fallos de red valida la resiliencia de microservicios antes de llegar a producción.
  • Herramientas como Netem y Toxiproxy permiten inyectar retrasos y pérdidas de paquetes con precisión.
  • Los sistemas distribuidos deben manejar tiempos de espera y reintentos automáticos sin corromper datos.
  • La instrumentación adecuada mediante métricas ayuda a identificar cuellos de botella antes de afectar usuarios.
  • Las pruebas de caos en entornos de prueba evitan sorpresas desagradables en momentos de alto tráfico.

Por qué simular fallos de red en entornos de prueba

Cuando construimos arquitecturas de microservicios, asumimos inconscientemente que la red entre ellos siempre es rápida y confiable. En el mundo real, los cables se cortan, los enrutadores se reinician y los paquetes desaparecen a mitad de camino. Para garantizar que su aplicación no se congele cuando ocurra lo peor, debe probar activamente la resiliencia antes de lanzar código nuevo. Tal como explicamos al tratar cómo diseñar colas de mensajes tolerantes a fallos, anticiparse al caos es el único camino hacia la estabilidad.

La inyección de fallos consiste en corromper, retrasar o descartar intencionalmente el tráfico de red dentro de un entorno controlado de pruebas. Esto nos permite observar cómo reaccionan los servicios ante una desconexión repentina o una lentitud extrema. En lugar de esperar que la infraestructura nunca falle, forzamos al sistema a demostrar que sabe recuperarse por sí solo. En la práctica, esto significa que su aplicación debe manejar tiempos de espera, reintentos y disyuntores de circuito sin generar errores en cascada para el usuario final.

Herramientas modernas para inyección de latencia y pérdida

Existen diferentes enfoques para manipular el tráfico de red durante pruebas automatizadas o manuales. A nivel del sistema operativo Linux, la utilidad Netem opera junto con iproute2 para modificar paquetes directamente en las interfaces de red virtuales o físicas. Es excelente para pruebas de infraestructura, simulando conexiones vía satélite o redes móviles inestables. Si alguna vez ha lidiado con la frustración de investigar por qué la placa se reinicia sola y cómo probar pistas, sabe que comprender el comportamiento físico y de enlace ahorra horas de depuración.

Otra alternativa muy popular entre los desarrolladores de microservicios es Toxiproxy, creado por Shopify. Funciona como un proxy TCP que se sitúa entre su aplicación y la base de datos o API externa. Con él, podemos crear reglas mediante una API HTTP para inyectar exactamente diez por ciento de pérdida de paquetes o retrasar respuestas en quinientos milisegundos en una ruta específica. Esta granularidad es perfecta para ejecutar conjuntos de pruebas de integración automatizadas que validen el comportamiento del sistema bajo estrés severo.

Implementando escenarios de prueba con Toxiproxy

Para poner manos a la obra y configurar un entorno realista, instalemos Toxiproxy en un archivo de infraestructura Docker Compose. El primer paso consiste en definir el contenedor del proxy apuntando al servicio dependiente, como una base de datos PostgreSQL. De esta manera, cada llamada que su microservicio haga a la base de datos pasará primero por el proxy, permitiendo la manipulación quirúrgica de los paquetes de red sin alterar una sola línea de código.

version: '3.8'&#nservices:&#n  toxiproxy:&#n    image: shopify/toxiproxy&#n    ports:&#n      - "8474:8474"&#n      - "5433:5433"&#n    environment:&#n      - TOXIPROXY_HOST=0.0.0.0&#n  database:&#n    image: postgres:15-alpine&#n    environment:&#n      - POSTGRES_PASSWORD=secret&#n

Con el contenedor en ejecución, el segundo paso es registrar la ruta que deseamos monitorear a través de la API de control de Toxiproxy. Puede enviar una solicitud HTTP simple usando la herramienta curl desde su máquina de pruebas para registrar el servicio de base de datos en el puerto configurado. Esta automatización se integra fácilmente en su tubería de CI/CD para ejecutar pruebas de resiliencia antes de cualquier promoción de entorno.

curl -X POST http://localhost:8474/proxies -d '{&#n  "name": "postgresql_db",&#n  "listen": "0.0.0.0:5433",&#n  "upstream": "database:5432"&#n}'&#n

El tercer y último paso práctico consiste en inyectar el fallo justo antes de ejecutar la prueba de integración automatizada. En el ejemplo siguiente, agregamos una regla de toxicidad llamada timeout que descarta el veinte por ciento de los paquetes de red de forma aleatoria, simulando una conexión degradada. Tan pronto como finaliza la prueba, podemos eliminar la regla instantáneamente vía API para normalizar el entorno.

curl -X POST http://localhost:8474/proxies/postgresql_db/toxics -d '{&#n  "type": "timeout",&#n  "attributes": {&#n    "timeout": 1000&#n  },&#n  "toxicity": 20&#n}&#nMientras monitoreamos registros, herramientas de observabilidad como Prometheus ayudan a rastrear anomalías, respaldando prácticas vistas en cómo crear alertas eficientes en Prometheus y Grafana sin fatiga.&#n'

Validando el comportamiento de los microservicios

Una vez inyectada la pérdida de paquetes, el verdadero trabajo de ingeniería comienza al analizar las métricas recolectadas. Si su aplicación utiliza patrones como Circuit Breaker, debe dejar de enviar solicitudes al servicio inestable tras alcanzar un límite de errores, devolviendo un valor alternativo o en caché. De lo contrario, el microservicio seguirá intentando conectar, agotando las conexiones disponibles y derribando toda la cadena de dependencias por efecto dominó.

Otro punto crítico es observar el tiempo de respuesta y el uso de memoria durante la degradación de la red. Sin una herramienta de inyección de latencia, los problemas de concurrencia causados por esperas infinitas solo aparecen en producción, cuando miles de usuarios reales están conectados. Simular estas condiciones en entornos de prueba transforma la incertidumbre operativa en datos predecibles, permitiendo ajustar los tiempos de espera con total confianza.

Conclusión

La ingeniería de resiliencia va mucho más allá de escribir código limpio; exige estar preparados para el colapso inevitable de la infraestructura de red. El uso de herramientas como Toxiproxy y Netem en entornos de validación desmitifica el comportamiento de los sistemas distribuidos bajo presión. Al adoptar pruebas de inyección de fallos como parte rutinaria del desarrollo, su equipo adquiere la confianza necesaria para operar arquitecturas complejas sin temor a lo imprevisible.