Comment prévenir trop de connexions dans les déploiements n8n à haute concurrence ?

Salut à tous
J’exécute n8n avec plusieurs workers, et à mesure que la concurrence augmente, je commence à réfléchir à la gestion des connexions PostgreSQL.
Mon architecture est à peu près :
Load Balancer

Plusieurs workers n8n

PostgreSQL
Ma préoccupation est que si chaque worker ouvre plusieurs connexions à la base de données, la base de données pourrait finalement atteindre sa limite de connexions, ce qui affecterait les performances et la stabilité des workflows.
J’envisage d’utiliser un pooleur de connexions comme PgBouncer, mais j’aimerais comprendre comment d’autres gèrent cela en production.
Pour ceux qui exécutent PostgreSQL avec des déploiements n8n à forte concurrence :
Comment décidez-vous du bon paramètre max_connections ?
Utilisez-vous un pooleur de connexions comme PgBouncer, ou le comportement par défaut de PostgreSQL est-il suffisant ?
Comment surveillez-vous l’épuisement des connexions avant que cela ne devienne un problème ?
Avez-vous trouvé que l’augmentation du nombre de workers ou l’optimisation des requêtes a un impact plus important sur les performances globales de la base de données ?

Décrivez le problème/l’erreur/la question

Quel est le message d’erreur (le cas échéant) ?

Veuillez partager votre workflow

(Sélectionnez les nœuds sur votre canevas et utilisez les raccourcis clavier CMD+C/CTRL+C et CMD+V/CTRL+V pour copier et coller le workflow.)

Partagez la sortie retournée par le dernier nœud

Informations sur votre configuration n8n

  • Version n8n :
  • Base de données (par défaut : SQLite) :
  • Paramètre n8n EXECUTIONS_PROCESS (par défaut : own, main) :
  • Exécution de n8n via (Docker, npm, n8n cloud, application de bureau) :
  • Système d’exploitation :

Salut @Keira_Becky, en attendant une réponse, voici quelques ressources qui pourraient t’aider :

Ressources suggérées

Automatiquement associées à ta question.

Documentation :

Forum :

@Wouter_Nigrini, @Yo_its_prakash, @jcuypers - vous avez déjà aidé avec des problèmes similaires, pouvez-vous y jeter un œil ?

Suggéré automatiquement par le bot communautaire de n8n. C’est un projet pilote - partage tes commentaires ici.

Bonjour @Keira_Becky Une bonne approche consiste à optimiser l’utilisation des connexions avant d’augmenter la limite de connexion.

Approche recommandée
Au lieu d’augmenter continuellement max_connections, utilisez un pooler de connexions comme PgBouncer pour réutiliser efficacement les connexions existantes.

n8n Workers

PgBouncer

PostgreSQL

Cela réduit les frais généraux de connexion et aide PostgreSQL à gérer la concurrence plus élevée plus efficacement.

Bonnes pratiques
Utilisez le pooling de connexions pour plusieurs workers
Définissez max_connections en fonction du CPU et de la mémoire de votre serveur
Surveillez les connexions actives, inactives et en attente
Optimisez les requêtes lentes avant d’ajouter plus de workers

Soyez attentif à : Connexions actives
Connexions inactives
Temps d’attente de connexion
Latence des requêtes
Utilisation du CPU et de la mémoire

En production, le pooling de connexions et l’optimisation des requêtes offrent généralement une meilleure scalabilité que l’augmentation simple de la limite de connexion de PostgreSQL.

Dans un déploiement n8n standard, la formule n’est pas simplement workers * 1. Chaque processus worker peut maintenir un pool de connexions.

La Logique de Calcul :

  • Instance Principale : Nécessite quelques connexions pour l’interface utilisateur, l’API et le planificateur.
  • Workers : Chaque processus worker maintient généralement un petit pool. Si vous avez 10 workers et que chacun autorise un pool de 10, vous êtes à 100 connexions juste pour les workers.
  • Surcharge : Postgres alloue de la mémoire pour chaque connexion (environ 2-10 Mo selon work_mem). Définir max_connections trop haut (par exemple, 5000) sans suffisamment de RAM causera au système d’exploitation de tuer Postgres via le OOM killer.

Recommandation : Commencez avec max_connections = 200-500 pour les déploiements de taille moyenne. Si vous dépassez cette limite, ne pas simplement continuer à augmenter le nombre ; passez à un pooler.

PgBouncer est pour les environnements de production à haute concurrence.

Le comportement par défaut de PostgreSQL est « un processus par connexion », ce qui est coûteux. PgBouncer agit comme un proxy léger qui gère un pool de connexions « réelles » à la base de données tout en permettant des milliers de connexions « virtuelles » provenant des workers n8n.

Cela vous aide-t-il ?

Salut @Keira_Becky
Le levier par processus est DB_POSTGRESDB_POOL_SIZE, qui par défaut vaut 2, donc l’empreinte est approximativement (processus principaux + workers + processeurs de webhooks) multiplié par cette valeur, et vous dimensionnez la base de données autour de ce chiffre au lieu d’estimer à partir du nombre de workers. Augmentez-le par processus uniquement quand les workers attendent réellement sur le pool.
Mettez à l’échelle en exécutant moins de workers avec une concurrence plus élevée plutôt que de nombreux workers avec une faible concurrence. n8n recommande 5 ou plus par worker car un grand nombre de workers à faible concurrence épuise le pool de connexions et provoque des retards et des défaillances :

n8n worker --concurrency=10

@Niffzy

Utilises-tu PgBouncer en mode transaction ou en mode session avec n8n ? Si tu as essayé les deux, quelles différences as-tu remarquées en production ?

Cela dépend de votre charge de travail, mais pour la plupart des applications à forte concurrence, le regroupement de transactions est souvent préféré car il permet de réutiliser les connexions de manière plus efficace et supporte un plus grand nombre de clients simultanés.

Le regroupement de sessions peut être un meilleur choix si votre application s’appuie sur des fonctionnalités spécifiques aux sessions, telles que les tables temporaires ou les variables de session, puisque chaque client conserve la même connexion de base de données pendant toute la session.

Avant de choisir un mode, je vous conseille de le tester dans un environnement de staging et de vérifier que vos workflows n8n ne dépendent pas du comportement spécifique aux sessions. Ensuite, surveillez l’utilisation des connexions, la latence des requêtes et le débit global pour confirmer que cela fonctionne comme prévu.

En général, le meilleur choix dépend de la façon dont votre application utilise les connexions de base de données, il vaut donc la peine de le valider avec des charges de travail similaires à celles de la production avant de procéder au déploiement.