Flujos de trabajo Multi-Tenant en n8n con Lógica Compartida pero Estado Aislado

Hola a todos,
Estoy diseñando una configuración más avanzada de n8n donde múltiples clientes/inquilinos usan la misma lógica de flujo de trabajo, pero cada inquilino tiene:
• Credenciales de API diferentes
• Límites de velocidad diferentes
• Bases de datos/almacenamiento separados
• Volúmenes de ejecución diferentes
Ahora mismo, estoy debatiendo entre:
Un flujo de trabajo compartido + credenciales/configuración dinámica
vs
Flujo de trabajo separado por inquilino
El enfoque compartido es más fácil de mantener, pero me preocupa:
• Aislamiento de credenciales
• Colisiones de límites de velocidad
• Un inquilino afectando las ejecuciones de otro
• Depuración y observabilidad a escala
El enfoque de flujo de trabajo separado proporciona aislamiento, pero gestionar actualizaciones en muchos flujos de trabajo resulta tedioso.
También estoy considerando:
• Base de datos de configuración central por inquilino
• Inyección dinámica de credenciales
• Enrutamiento de ejecución basado en cola
• Instancias de worker separadas para inquilinos con alto volumen

Describir el problema/error/pregunta

Para personas que ejecutan n8n en producción con múltiples flujos de trabajo:
¿Qué arquitectura ha funcionado mejor?
¿Cómo manejas el aislamiento versus la mantenibilidad?
¿Hay patrones que evitarías firmemente?

¿Cuál es el mensaje de error (si hay alguno)?

Por favor, comparte tu flujo de trabajo

(Selecciona los nodos en tu lienzo y usa los atajos de teclado CMD+C/CTRL+C y CMD+V/CTRL+V para copiar y pegar el flujo de trabajo.)

Comparte el resultado devuelto por el último nodo

Información sobre tu configuración de n8n

  • Versión de n8n:
  • Base de datos (predeterminada: SQLite):
  • Configuración EXECUTIONS_PROCESS de n8n (predeterminada: own, main):
  • Ejecutando n8n a través de (Docker, npm, n8n cloud, aplicación de escritorio):
  • Sistema operativo:

Hola @Keira_Becky Una configuración híbrida generalmente funciona mejor.

En lugar de crear un flujo de trabajo separado

La mayoría de las personas usan: Un flujo de trabajo compartido + configuración separada para cada inquilino

Así que el flujo de trabajo se mantiene igual, pero cada inquilino tiene su propio:
• Claves API
• Base de datos
• Límites de velocidad
• Configuración

cargada dinámicamente usando un tenant_id.

Por qué esto es mejor: Es más fácil de mantener
Solo actualizas un flujo de trabajo
Menos duplicación

Incluso con flujos de trabajo compartidos, intenta mantener:
• Credenciales
• Colas
• Límites de velocidad
• Datos de ejecución

separados por inquilino para evitar que un cliente afecte a otro.

Para inquilinos muy grandes, algunos equipos usan:

Trabajador / cola dedicado

para que el tráfico pesado de un inquilino no ralentice a los demás.

¡Pregunta muy bien planteada, @Keira_Becky! Esta es una de esas decisiones de arquitectura que es fácil equivocarse al principio y dolorosa de refactorizar después.

El enfoque híbrido de Niffzy es el punto de partida correcto. Así es como yo analizaría cada una de tus preocupaciones en la práctica:

Aislamiento de credenciales: En n8n no puedes inyectar credenciales dinámicamente en tiempo de ejecución (las credenciales se vinculan en el momento en que se construye el flujo de trabajo). La solución que la mayoría de equipos utilizan es almacenar las claves API en una tabla de configuración centralizada (Postgres o incluso una simple hoja de Google) indexada por tenant_id, y luego obtenerlas al inicio de cada ejecución mediante un nodo HTTP Request o de base de datos, pasándolas como variables a los nodos posteriores que aceptan encabezados de autenticación personalizados. No es perfecto, pero funciona bien para la mayoría de las APIs REST.

Colisiones de límites de velocidad: El Queue Mode es tu mejor aliado aquí. Ejecuta n8n con EXECUTIONS_MODE=queue y Redis, luego asigna diferentes límites de concurrencia por flujo de trabajo o utiliza varios workers. Incluso puedes etiquetar los inquilinos de alto volumen a un worker dedicado.

Un inquilino afectando a otros: Con queue mode + límites de concurrencia por flujo de trabajo, esto está prácticamente resuelto. Para mayor seguridad, considera una instancia de n8n separada (o un proyecto de n8n Cloud) para tus inquilinos más grandes o críticos.

Depuración a escala: Etiqueta cada ejecución con un tenant_id en la salida de tu primer nodo. De esa manera puedes filtrar los registros de ejecución por inquilino fácilmente. Algunos equipos también escriben una entrada de registro en una BD centralizada al inicio y al final de cada ejecución.

Patrón a evitar fuertemente: Almacenar estado por inquilino en variables estáticas o memoria a nivel de flujo de trabajo. Contamina las ejecuciones de forma impredecible.

¡Feliz de profundizar en cualquiera de estos puntos si es útil!

Gracias @Niffzy @nguyenthieutoan