跳至内容

队列模式#

您可以根据需求以不同模式运行n8n。队列模式提供最佳的可扩展性。

二进制数据存储

n8n不支持在文件系统中存储二进制数据的队列模式。如果工作流需要在队列模式下持久化二进制数据,可以使用S3外部存储

工作原理#

在队列模式下运行时,您设置了多个n8n实例,其中一个主实例接收工作流信息(如触发器),工作实例则负责执行任务。

每个工作线程都是独立的Node.js实例,运行在main模式下,但由于其高IOPS(每秒输入输出操作数),能够同时处理多个工作流执行。

通过使用工作实例并以队列模式运行,您可以根据需要扩展n8n(通过添加工作实例)或缩减(通过移除工作实例)以处理工作负载。

这是流程示意图:

  1. 主n8n实例负责处理定时器和Webhook调用,生成(但不运行)工作流执行。
  2. 它将执行ID传递给消息代理Redis,该代理维护待处理执行队列,并允许下一个可用工作节点获取它们。
  3. 池中的一个工作线程从Redis中获取消息。
  4. 工作线程使用执行ID从数据库中获取工作流信息。
  5. After completing the workflow execution, the worker:
    • 将结果写入数据库。
    • 发布到Redis,表示执行已完成。
  6. Redis 通知主实例。

"Diagram showing the flow of data between the main n8n instance, Redis, the n8n workers, and the n8n database"

配置工作节点#

Workers是执行实际工作的n8n实例。它们从主n8n进程接收关于需要执行的工作流的信息,执行这些工作流,并在每次执行完成后更新状态。

设置加密密钥#

n8n在首次启动时会自动生成一个加密密钥。如果需要,您也可以通过环境变量提供自定义密钥。

主n8n实例的加密密钥必须与所有工作节点和webhooks处理器节点共享,以确保这些工作节点能够访问存储在数据库中的凭据。

为每个工作节点设置加密密钥,可以通过配置文件或设置相应的环境变量来实现:

1
export N8N_ENCRYPTION_KEY=<main_instance_encryption_key>

设置执行模式#

数据库注意事项

n8n 推荐使用 Postgres 13+ 版本。不建议在将执行模式设置为 queue 时使用 SQLite 数据库运行 n8n。

在主实例和任何工作节点上使用以下命令将环境变量EXECUTIONS_MODE设置为queue

1
export EXECUTIONS_MODE=queue

或者,您可以在配置文件中将executions.mode设置为queue

启动Redis#

在独立机器上运行Redis

您可以在单独的机器上运行Redis,只需确保n8n实例能够访问它。

要在Docker容器中运行Redis,请按照以下说明操作:

运行以下命令启动Redis实例:

1
docker run --name some-redis -p 6379:6379  -d redis

默认情况下,Redis运行在localhost6379端口且无需密码。根据您的Redis配置,请为主n8n进程设置以下配置。这些设置将允许n8n与Redis进行交互。

使用配置文件 使用环境变量 描述
queue.bull.redis.host:localhost QUEUE_BULL_REDIS_HOST=localhost By default, Redis runs on localhost.
queue.bull.redis.port:6379 QUEUE_BULL_REDIS_PORT=6379 The default port is 6379. If Redis is running on a different port, configure the value.

您还可以设置以下可选配置:

使用配置文件 使用环境变量 描述
queue.bull.redis.username:USERNAME QUEUE_BULL_REDIS_USERNAME By default, Redis doesn't require a username. If you're using a specific user, configure it variable.
queue.bull.redis.password:PASSWORD QUEUE_BULL_REDIS_PASSWORD By default, Redis doesn't require a password. If you're using a password, configure it variable.
queue.bull.redis.db:0 QUEUE_BULL_REDIS_DB The default value is 0. If you change this value, update the configuration.
queue.bull.redis.timeoutThreshold:10000ms QUEUE_BULL_REDIS_TIMEOUT_THRESHOLD Tells n8n how long it should wait if Redis is unavailable before exiting. The default value is 10000 (ms).
queue.bull.gracefulShutdownTimeout:30 N8N_GRACEFUL_SHUTDOWN_TIMEOUT A graceful shutdown timeout for workers to finish executing jobs before terminating the process. The default value is 30 seconds.

现在你可以启动你的n8n实例,它将连接到你的Redis实例。

启动工作线程#

您需要启动工作进程以允许n8n执行工作流。如果要在单独的机器上托管工作进程,请在该机器上安装n8n,并确保其连接到您的Redis实例和n8n数据库。

通过从根目录运行以下命令来启动工作进程:

1
./packages/cli/bin/n8n worker

如果您正在使用Docker,请使用以下命令:

1
docker run --name n8n-queue -p 5679:5678 docker.n8n.io/n8nio/n8n worker

您可以设置多个工作进程。确保所有工作进程都能访问Redis和n8n数据库。

工作服务器#

每个工作进程运行一个服务器,该服务器暴露了以下可选端点:

  • /healthz: 返回工作节点是否正常运行,前提是您启用了QUEUE_HEALTH_CHECK_ACTIVE环境变量
  • /healthz/readiness: 返回工作线程的数据库和Redis连接是否就绪,前提是启用了QUEUE_HEALTH_CHECK_ACTIVE环境变量
  • credentials overwrite endpoint
  • /metrics

查看运行中的工作线程#

功能可用性

  • 适用于自托管企业版计划。
  • 如需在Cloud Enterprise上使用此功能,请联系n8n

您可以在n8n中通过选择设置 > 工作节点来查看正在运行的worker及其性能指标。

使用队列运行n8n#

当使用队列运行n8n时,所有生产环境的工作流执行都由工作进程处理。这意味着即使是webhook调用也会被委托给工作进程,这可能会增加一些开销和额外的延迟。

Redis作为消息代理,数据库用于持久化数据,因此需要访问这两者。不支持在此设置下通过SQLite运行分布式系统。

迁移数据

如果您想将数据从一个数据库迁移到另一个数据库,可以使用导出和导入命令。请参考n8n的CLI命令文档了解如何使用这些命令。

Webhook处理器#

请记住

Webhook处理依赖于Redis,并且还需要设置EXECUTIONS_MODE环境变量。请按照上方的配置工作节点部分来设置webhook处理器节点。

Webhook处理器是n8n中的另一层扩展机制。配置webhook处理器是可选的,它允许您扩展传入的webhook请求处理能力。

该方法允许n8n处理大量并行请求。您只需相应添加更多webhook进程和工作线程即可。webhook进程将在相同端口(默认:5678)监听请求。在容器或独立机器中运行这些进程,并通过负载均衡系统来相应路由请求。

n8n不建议将主进程添加到负载均衡池中。如果将主进程加入池中,它将接收请求并可能承受重负载。这将导致编辑、查看和与n8n UI交互的性能下降。

你可以通过从根目录执行以下命令来启动webhook处理器:

1
./packages/cli/bin/n8n webhook

如果您正在使用Docker,请使用以下命令:

1
docker run --name n8n-queue -p 5679:5678 -e "EXECUTIONS_MODE=queue" docker.n8n.io/n8nio/n8n webhook

配置webhook URL#

要配置您的webhook URL,请在运行主n8n实例的机器上执行以下命令:

1
export WEBHOOK_URL=https://your-webhook-url.com

你也可以在配置文件中设置这个值。

配置负载均衡器#

当使用多个Webhook进程时,您需要一个负载均衡器来路由请求。如果您为n8n实例和Webhooks使用相同的域名,可以按以下方式设置负载均衡器来路由请求:

  • 将任何匹配 /webhook/* 的请求重定向到 webhook 服务器池
  • 所有其他路径(n8n内部API、编辑器的静态文件等)应路由到主进程

注意: 手动工作流执行的默认URL是 /webhook-test/*。请确保这些URL路由到您的主进程。

您可以在配置文件endpoints.webhook中修改此路径,或使用N8N_ENDPOINT_WEBHOOK环境变量。如果修改了这些设置,请相应地更新您的负载均衡器。

在主进程中禁用webhook处理(可选)#

您可以使用Webhook处理器来执行工作流。您可以在主进程中禁用Webhook处理功能。这将确保所有Webhook执行都在Webhook处理器中完成。在配置文件中,将endpoints.disableProductionWebhooksOnMainProcess设置为true,这样n8n就不会在主进程中处理Webhook请求。

或者,您可以使用以下命令:

1
export N8N_DISABLE_PRODUCTION_MAIN_PROCESS=true

在主进程中禁用webhook流程时,运行主进程且不将其添加到负载均衡器的webhook池中。

配置工作线程并发数#

您可以通过使用concurrency标志来定义工作线程可以并行运行的任务数量。默认值为10。如需修改:

1
n8n worker --concurrency=5

并发与扩展建议#

n8n建议将工作实例的并发数设置为5或更高。如果并发值设置过低且工作实例数量过多,可能会耗尽数据库的连接池,导致处理延迟和失败。

多主节点设置#

功能可用性

  • 适用于自托管企业版计划。
  • 如果您想在Cloud Enterprise上使用此功能,联系n8n

在队列模式下,您可以运行多个main进程以实现高可用性。

在单模式设置中,main进程执行两组任务:

  • 常规任务,例如运行API、提供UI服务和监听webhooks,以及
  • 最多执行一次的任务,例如运行非HTTP触发器(定时器、轮询器以及像RabbitMQ和IMAP这样的持久连接),以及清理执行记录和二进制数据。

在多主节点设置中,有两种main进程:

  • followers,用于运行定期任务,以及
  • 领导者,负责运行常规任务和最多执行一次的任务

领导者指定#

在多主节点设置中,所有主实例对用户透明地处理领导权流程。如果当前领导者变为不可用(例如因崩溃或事件循环过载),其他跟随者可以接管。若原领导者恢复响应能力,则会转变为跟随者角色。

配置多主节点设置#

要在多主节点设置中部署n8n,请确保:

  • 所有main进程都以队列模式运行,并连接到Postgres和Redis。
  • 所有 mainworker 进程都运行相同版本的 n8n。
  • 所有 main 进程都已将环境变量 N8N_MULTI_MAIN_SETUP_ENABLED 设置为 true
  • 所有main进程都在启用了会话保持(粘性会话)的负载均衡器后运行。

如果需要,您可以调整leader键选项:

使用配置文件 使用环境变量 描述
multiMainSetup.ttl:10 N8N_MULTI_MAIN_SETUP_KEY_TTL=10 Time to live (in seconds) for leader key in multi-main setup.
multiMainSetup.interval:3 N8N_MULTI_MAIN_SETUP_CHECK_INTERVAL=3 Interval (in seconds) for leader check in multi-main setup.
优云智算