### Parte 1: El Dolor Real / Síntoma
Lanzas un fan-out de sub-flujo pesado (digamos, 10,000+ elementos procesados concurrentemente) esperando que el pipeline de ejecución se complete en unos minutos. En cambio, el historial de ejecución de la interfaz de n8n muestra flujos de trabajo atrapados en un estado ‘Ejecutándose’ perpetuo durante hasta 24 horas.
Sin embargo, cuando verificas los registros de nodos individuales, el tiempo de procesamiento por elemento es realmente rápido (alrededor de 200ms). Tu CPU y RAM están subutilizados, pero tu instancia de n8n alojada localmente se siente completamente sin respuesta. Los trabajos se acumulan, los webhooks agotan el tiempo de espera y tus alertas de monitoreo comienzan a sonar.
Parte 2: La Causa Raíz Arquitectónica
El cuello de botella no es tu lógica, y no es tu CPU. Es la contención de escritura en PostgreSQL y la persistencia hinchada del estado de ejecución.
Por defecto, n8n alojado localmente escribe cada estado de ejecución, entrada de nodo y salida de nodo directamente en tu base de datos PostgreSQL (tabla execution_entity). Cuando haces un fan-out de 10,000 elementos concurrentemente, n8n intenta miles de operaciones de escritura simultáneas y actualizaciones de índices en la base de datos.
PostgreSQL se ralentiza rápidamente debido a la contención de bloqueos, el agotamiento del pool de conexiones y los límites de flushing de WAL (Write-Ahead Log). El hilo de ejecución queda bloqueado esperando confirmaciones de escritura en la base de datos, causando que la interfaz de usuario y la cola de ejecución se congelen mientras la base de datos lucha por vaciar su cola de escritura.
Parte 3: La Corrección Arquitectónica en 3 Pasos
Para manejar fan-out de alto volumen sin sobrecargar tu base de datos, debes desacoplar la persistencia de datos de la velocidad de ejecución y controlar la concurrencia.
- Implementa Chunking y Batching a través del Loop Node
- Nunca descargues 10,000 elementos en un sub-flujo paralelo simultáneamente.
- Inserta un nodo Loop Node o Split In Batches aguas arriba. Procesa tu payload en lotes controlados (por ejemplo, fragmentos de 100 a 250 elementos).
- Agrega un nodo
Waitmicroscópico (por ejemplo, 50ms–100ms) entre lotes para permitir que la cola de I/O de la base de datos se vacíe.
- Ajusta PostgreSQL para Operaciones de Escritura de Alto Rendimiento
- Tu
postgresql.confpredeterminado está optimizado para aplicaciones web generales, no para streaming de eventos de alta frecuencia. Ajusta estos parámetros en tu configuración de contenedor/servidor: - Aumenta
shared_buffers(típicamente 25% de la RAM total). - Aumenta
effective_cache_size(50% a 75% de la RAM total). - Ajusta
wal_buffersy establececheckpoint_completion_target = 0.9para suavizar picos de escritura en disco. - Asegúrate de que tu base de datos se ejecute en almacenamiento NVMe rápido con IOPS elevado.
- Purga Agresivamente los Datos del Historial de Ejecución
- Deja de mantener registros de ejecución para siempre. Establece variables de entorno en tu despliegue de n8n para purgar automáticamente las ejecuciones exitosas:
EXECUTIONS_DATA_PRUNE=trueEXECUTIONS_DATA_MAX_AGE=168(mantener datos solo por 7 días)EXECUTIONS_DATA_PRUNE_MAX_COUNT=50000- Esto mantiene el índice de la base de datos pequeño y evita la hinchazón en la tabla
execution_entity.
Parte 4: Conclusión Comunitaria Abierta
¿Estás viendo bloqueos de ejecución o retraso de base de datos en tu instancia de n8n alojada localmente durante pipelines pesados de inteligencia artificial o ingesta de datos? Publica tus especificaciones de infraestructura (RAM, tipo de DB, volumen de elementos) y cuellos de botella actuales en el hilo a continuación, y resolvamos tu configuración de cola juntos.