跳到主要内容

队列模式#

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

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

工作原理#

在队列模式下运行时,您需要部署多个n8n实例:一个主实例负责接收工作流信息(如触发器),多个工作实例负责执行任务。

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

通过使用工作器实例和队列模式,您可以根据工作负载需求灵活扩展n8n:增加工作器实现扩容,移除工作器实现缩容。

执行流程如下:

  1. 主n8n实例处理定时器和网络钩子调用,生成(但不运行)工作流执行任务
  2. 将执行ID传递至消息代理Redis,由它维护待执行任务队列并分配至空闲工作器
  3. 工作器池中的某个实例从Redis获取任务消息
  4. 工作器使用执行ID从数据库获取工作流信息
  5. 完成工作流执行后,工作器:
    • 将结果写入数据库
    • 向Redis发送执行完成通知
  6. Redis通知主实例

"展示主n8n实例、Redis、n8n工作器与数据库间数据流向的示意图"

配置工作器#

工作器是实际执行任务的n8n实例。它们从主n8n进程接收待执行工作流信息,执行工作流,并在每次执行完成后更新状态。

设置加密密钥#

n8n在首次启动时会自动生成加密密钥。您也可以通过环境变量设置自定义密钥。

主n8n实例的加密密钥需与所有工作器及网络钩子处理器节点共享,以确保这些工作节点能够访问数据库中存储的凭据。

通过配置文件或设置对应环境变量为每个工作器节点配置加密密钥:

export N8N_ENCRYPTION_KEY=<main_instance_encryption_key>

设置执行模式#

数据库注意事项

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

请通过以下命令在主实例和所有工作节点上设置环境变量 EXECUTIONS_MODEqueue

export EXECUTIONS_MODE=queue

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

启动 Redis#

在独立机器上运行 Redis

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

要在 Docker 容器中运行 Redis,请遵循以下说明:

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

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

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

使用配置文件使用环境变量说明
queue.bull.redis.host:localhostQUEUE_BULL_REDIS_HOST=localhost默认情况下,Redis 在 localhost 上运行。
queue.bull.redis.port:6379QUEUE_BULL_REDIS_PORT=6379默认端口为 6379。如果 Redis 运行在其他端口,请配置此值。

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

使用配置文件使用环境变量说明
queue.bull.redis.username:USERNAMEQUEUE_BULL_REDIS_USERNAME默认情况下,Redis 不需要用户名。如果使用特定用户,请配置此变量。
queue.bull.redis.password:PASSWORDQUEUE_BULL_REDIS_PASSWORD默认情况下,Redis 不需要密码。如果使用密码,请配置此变量。
queue.bull.redis.db:0QUEUE_BULL_REDIS_DB默认值为 0。如果更改此值,请更新配置。
queue.bull.redis.timeoutThreshold:10000msQUEUE_BULL_REDIS_TIMEOUT_THRESHOLD设置 n8n 在 Redis 不可用时应等待多久再退出。默认值为 10000 毫秒。
queue.bull.gracefulShutdownTimeout:30N8N_GRACEFUL_SHUTDOWN_TIMEOUT工作进程在终止前完成执行任务的优雅关闭超时时间。默认值为 30 秒。

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

启动工作进程#

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

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

./packages/cli/bin/n8n worker

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

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

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

工作服务器#

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

  • /healthz:在启用 QUEUE_HEALTH_CHECK_ACTIVE 环境变量时,返回工作进程是否正常运行
  • /healthz/readiness:在启用 QUEUE_HEALTH_CHECK_ACTIVE 环境变量时,返回工作进程的数据库和 Redis 连接是否就绪
  • 凭据覆盖端点
  • /metrics

查看运行中的工作进程#

功能可用性

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

您可以在 n8n 中选择 设置 > 工作进程 来查看运行中的工作进程及其性能指标。

使用队列运行 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 处理器:

./packages/cli/bin/n8n webhook

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

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

配置 Webhook URL#

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

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

您也可以在配置文件中设置此值。

配置负载均衡器#

使用多个Webhook进程时,需要通过负载均衡器路由请求。如果为n8n实例和Webhook使用相同域名,可按以下方式配置负载均衡器路由规则:

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

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

可通过配置文件中的 endpoints.webhookN8N_ENDPOINT_WEBHOOK 环境变量修改此路径。修改后请同步更新负载均衡器配置。

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

当已部署Webhook处理器执行工作流时,可在主进程中禁用Webhook处理功能,确保所有Webhook执行均由专用处理器完成。在配置文件中将 endpoints.disableProductionWebhooksOnMainProcess 设为 true,即可禁止n8n在主进程中处理Webhook请求。

或使用以下命令:

export N8N_DISABLE_PRODUCTION_MAIN_PROCESS=true

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

配置工作进程并发数#

您可通过 concurrency 参数定义单个工作进程能并行执行的任务数量,默认值为 10。修改方式如下:

n8n worker --concurrency=5

并发与扩展建议#

n8n 建议将工作实例的并发数设置为 5 或更高。在拥有大量工作实例的情况下设置较低的并发值,可能导致数据库连接池耗尽,进而引发处理延迟和故障。

多主节点设置#

功能可用性

  • 仅限自托管企业版方案

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

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

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

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

  • 跟随者:运行常规任务
  • 领导者:同时运行常规任务和最多一次任务

领导者指定机制#

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

配置多主节点设置#

部署 n8n 多主节点设置需确保:

  • 所有 main 进程均以队列模式运行,并连接至 Postgres 和 Redis
  • 所有 mainworker 进程运行相同版本的 n8n
  • 所有 main 进程已设置环境变量 N8N_MULTI_MAIN_SETUP_ENABLEDtrue
  • 所有 main 进程部署在启用会话持久性(粘性会话)的负载均衡器后方

如需调整领导者键选项:

配置文件配置环境变量配置说明
multiMainSetup.ttl:10N8N_MULTI_MAIN_SETUP_KEY_TTL=10多主节点设置中领导者键的存活时间(秒)
multiMainSetup.interval:3N8N_MULTI_MAIN_SETUP_CHECK_INTERVAL=3多主节点设置中领导者检查间隔(秒)