队列模式#
您可以根据需求以不同模式运行 n8n。队列模式提供了最佳的扩展性。
二进制数据存储
n8n 不支持使用文件系统存储二进制数据的队列模式。如果工作流需要在队列模式下持久化二进制数据,可以使用 S3 外部存储。
工作原理#
在队列模式下运行时,您需要设置多个 n8n 实例:一个主实例接收工作流信息(如触发器),多个工作实例负责执行任务。
每个工作器都是独立的 Node.js 实例,运行在 main
模式下,但由于其高 IOPS(每秒输入输出操作数)能力,能够同时处理多个工作流执行。
通过使用工作器实例和队列模式,您可以根据工作负载需求灵活扩展 n8n(增加工作器)或缩减规模(减少工作器)。
以下是处理流程:
- 主 n8n 实例处理定时器和 webhook 调用,生成(但不运行)工作流执行。
- 它将执行 ID 传递给消息代理 Redis,Redis 维护待执行队列并允许下一个可用工作器获取任务。
- 工作池中的某个工作器从 Redis 获取消息。
- 工作器使用执行 ID 从数据库获取工作流信息。
- 完成工作流执行后,工作器:
- 将结果写入数据库
- 向 Redis 发送执行完成的通知
- Redis 通知主实例。
配置工作器#
工作器是实际执行任务的 n8n 实例。它们从主 n8n 进程接收需要执行的工作流信息,执行工作流,并在每次执行完成后更新状态。
设置加密密钥#
n8n 在首次启动时会自动生成加密密钥。您也可以根据需要,通过环境变量提供自定义密钥。
主 n8n 实例的加密密钥必须与所有工作节点和 webhooks 处理器节点共享,以确保这些工作节点能够访问存储在数据库中的凭证。
通过配置文件或设置对应的环境变量为每个工作节点配置加密密钥:
1 |
|
设置执行模式#
数据库注意事项
n8n 推荐使用 Postgres 13+ 数据库。不建议在使用 SQLite 数据库时将执行模式设置为 queue
。
在主实例和所有工作节点上使用以下命令设置环境变量 EXECUTIONS_MODE
为 queue
。
1 |
|
或者,您可以在配置文件中将 executions.mode
设置为 queue
。
启动 Redis#
在独立机器上运行 Redis
您可以在单独的机器上运行 Redis,只需确保 n8n 实例能够访问它。
要在 Docker 容器中运行 Redis,请按照以下说明操作:
运行以下命令启动 Redis 实例:
1 |
|
默认情况下,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 |
工作进程在终止前完成执行任务的优雅关闭超时时间。默认值为 30 秒 |
现在您可以启动 n8n 实例,它将连接到您的 Redis 实例。
启动工作进程#
您需要启动工作进程以允许 n8n 执行工作流。如果要在单独的机器上托管工作进程,请在该机器上安装 n8n 并确保其连接到您的 Redis 实例和 n8n 数据库。
从根目录运行以下命令启动工作进程:
1 |
|
如果使用 Docker,请使用以下命令:
1 |
|
您可以设置多个工作进程。确保所有工作进程都能访问 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 处理器:
1 |
|
如果使用 Docker,请执行以下命令:
1 |
|
配置 Webhook URL#
要配置您的 webhook URL,请在运行主 n8n 实例的机器上执行以下命令:
1 |
|
您也可以在配置文件中设置此值。
配置负载均衡器#
当使用多个 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 |
|
当在主进程中禁用 webhook 处理时,请运行主进程但不要将其添加到负载均衡器的 webhook 池中。
配置工作器并发数#
您可以使用 concurrency
标志定义单个工作器可以并行运行的作业数量,默认值为 10
。修改方法:
1 |
|
并发与扩展建议#
n8n 建议将工作器实例的并发数设置为 5 或更高。如果设置较低的并发值并配合大量工作器,可能会耗尽数据库连接池,导致处理延迟和失败。
多主节点配置#
功能可用性
- 仅限自托管企业版计划可用。
在队列模式下,您可以运行多个 main
进程以实现高可用性。
在单节点配置中,main
进程执行两类任务:
- 常规任务,例如运行 API、提供 UI 服务和监听 webhook
- 最多一次任务,例如运行非 HTTP 触发器(定时器、轮询器以及 RabbitMQ 和 IMAP 等持久连接),以及清理执行记录和二进制数据
在多主节点配置中,存在两种 main
进程:
- 跟随节点,负责执行常规任务
- 领导节点,负责执行常规任务和最多一次任务
领导节点指定#
在多主节点配置中,所有主节点实例对用户透明地处理领导权转移过程。如果当前领导节点不可用(例如崩溃或事件循环过载),其他跟随节点可以接管。如果原领导节点恢复响应,则转为跟随节点。
配置多主节点设置#
要部署多主节点配置的 n8n,请确保:
- 所有
main
进程都运行在队列模式下,并连接到 Postgres 和 Redis - 所有
main
和worker
进程运行相同版本的 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 |
多主节点配置中领导检查的间隔时间(秒) |