Skip to content

队列模式#

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

二进制数据存储

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

工作原理#

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

每个 worker 都是自己的 Node.js 实例,以 main 模式运行,但由于高 IOPS(每秒输入输出操作)能够处理多个同时的工作流执行。

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

这是流程:

  1. 主 n8n 实例处理定时器和 webhook 调用,生成(但不运行)工作流执行。
  2. 它将执行 ID 传递给消息代理 Redis,该代理维护待处理执行的队列,并允许下一个可用的 worker 选择它们。
  3. 池中的 worker 从 Redis 中选择消息。
  4. worker 使用执行 ID 从数据库获取工作流信息。
  5. 完成工作流执行后,worker:
    • 将结果写入数据库。
    • 向 Redis 发布,说明执行已完成。
  6. Redis 通知主实例。

"显示主 n8n 实例、Redis、n8n worker 和 n8n 数据库之间数据流的图表"

配置 worker#

Worker 是执行实际工作的 n8n 实例。它们从主 n8n 进程接收有关必须执行的工作流的信息,执行工作流,并在每次执行完成后更新状态。

设置加密密钥#

n8n 在首次启动时自动生成加密密钥。如果需要,您也可以使用环境变量提供自己的自定义密钥。

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

配置文件中或通过设置相应的环境变量为每个 worker 节点设置加密密钥:

1
export N8N_ENCRYPTION_KEY=<main_instance_encryption_key>

设置执行模式#

数据库注意事项

n8n 建议使用 Postgres 13+。不建议在执行模式设置为 queue 的情况下使用 SQLite 数据库运行 n8n。

使用以下命令在主实例和任何 worker 上将环境变量 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 在 localhost 的端口 6379 上运行,没有密码。根据您的 Redis 配置,为主 n8n 进程设置以下配置。这些将允许 n8n 与 Redis 交互。

使用配置文件 使用环境变量 描述
queue.bull.redis.host:localhost QUEUE_BULL_REDIS_HOST=localhost 默认情况下,Redis 在 localhost 上运行。
queue.bull.redis.port:6379 QUEUE_BULL_REDIS_PORT=6379 默认端口是 6379。如果 Redis 在不同端口上运行,请配置该值。

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

使用配置文件 使用环境变量 描述
queue.bull.redis.username:USERNAME QUEUE_BULL_REDIS_USERNAME 默认情况下,Redis 不需要用户名。如果您使用特定用户,请配置此变量。
queue.bull.redis.password:PASSWORD QUEUE_BULL_REDIS_PASSWORD 默认情况下,Redis 不需要密码。如果您使用密码,请配置此变量。
queue.bull.redis.db:0 QUEUE_BULL_REDIS_DB 默认值是 0。如果您更改此值,请更新配置。
queue.bull.redis.timeoutThreshold:10000ms QUEUE_BULL_REDIS_TIMEOUT_THRESHOLD 告诉 n8n 如果 Redis 不可用,在退出之前应该等待多长时间。默认值是 10000(毫秒)。
queue.bull.gracefulShutdownTimeout:30 N8N_GRACEFUL_SHUTDOWN_TIMEOUT worker 在终止进程之前完成执行作业的优雅关闭超时。默认值是 30 秒。

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

启动 worker#

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

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

1
./packages/cli/bin/n8n worker

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

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

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

Worker 服务器#

每个 worker 进程运行一个服务器,公开可选端点:

  • /healthz:如果您启用 QUEUE_HEALTH_CHECK_ACTIVE 环境变量,返回 worker 是否启动
  • /healthz/readiness:如果您启用 QUEUE_HEALTH_CHECK_ACTIVE 环境变量,返回 worker 的数据库和 Redis 连接是否就绪
  • 凭据覆盖端点
  • /metrics

查看运行中的 worker#

功能可用性

  • 在自托管企业计划中可用。
  • 如果您想在云企业版中访问此功能,请联系 n8n

您可以通过选择 Settings > Workers 在 n8n 中查看运行中的 worker 及其性能指标。

使用队列运行 n8n#

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

Redis 充当消息代理,数据库持久化数据,因此需要访问两者。不支持在 SQLite 上使用此设置运行分布式系统。

迁移数据

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

Webhook 处理器#

记住

Webhook 进程依赖于 Redis,也需要设置 EXECUTIONS_MODE 环境变量。按照上面的配置 worker部分设置 webhook 处理器节点。

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

此方法允许 n8n 处理大量并行请求。您只需要相应地添加更多 webhook 进程和 worker。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 实例和 webhook 使用相同的域名,可以设置负载均衡器按以下方式路由请求:

  • 将匹配 /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 池中。

配置 worker 并发#

您可以使用 concurrency 标志定义 worker 可以并行运行的作业数。默认为 10。要更改它:

1
n8n worker --concurrency=5

并发和扩展建议#

n8n 建议为您的 worker 实例设置并发为 5 或更高。使用大量 worker 设置低并发值可能会耗尽数据库的连接池,导致处理延迟和失败。

多主设置#

功能可用性

  • 在自托管企业计划中可用。

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

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

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

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

  • 追随者,运行常规任务,以及
  • 领导者,运行常规和最多一次任务

领导者指定#

在多主设置中,所有主实例对用户透明地处理领导过程。如果当前领导者变得不可用,例如因为它崩溃或其事件循环变得太忙,其他追随者可以接管。如果以前的领导者再次响应,它就成为追随者。

配置多主设置#

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

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

如果需要,您可以调整领导者密钥选项:

使用配置文件 使用环境变量 描述
multiMainSetup.ttl:10 N8N_MULTI_MAIN_SETUP_KEY_TTL=10 多主设置中领导者密钥的生存时间(秒)。
multiMainSetup.interval:3 N8N_MULTI_MAIN_SETUP_CHECK_INTERVAL=3 多主设置中领导者检查的间隔(秒)。