队列模式#
您可以根据需要以不同模式运行 n8n。队列模式提供最佳的可扩展性。
二进制数据存储
n8n 不支持在文件系统中使用二进制数据存储的队列模式。如果您的工作流需要在队列模式中持久化二进制数据,您可以使用 S3 外部存储。
工作原理#
在队列模式中运行时,您有多个 n8n 实例设置,其中一个主实例接收工作流信息(如触发器),工作实例执行执行。
每个工作实例都是自己的 Node.js 实例,在 main
模式下运行,但由于其高 IOPS(每秒输入输出操作)能够处理多个同时工作流执行。
通过使用工作实例并在队列模式下运行,您可以根据需要扩展 n8n(通过添加工作实例)和缩小(通过删除工作实例)以处理工作负载。
这是流程:
- 主 n8n 实例处理定时器和 webhook 调用,生成(但不运行)工作流执行。
- 它将执行 ID 传递给消息代理 Redis,后者维护待处理执行的队列,并允许下一个可用的工作实例来获取它们。
- 池中的工作实例从 Redis 获取消息。
- 工作实例使用执行 ID 从数据库获取工作流信息。
- 完成工作流执行后,工作实例:
- 将结果写入数据库。
- 向 Redis 发布消息,表示执行已完成。
- Redis 通知主实例。
配置工作器#
工作器是执行实际工作的 n8n 实例。它们从主 n8n 进程接收有关必须执行的工作流的信息,执行工作流,并在每次执行完成后更新状态。
设置加密密钥#
n8n 在首次启动时自动生成加密密钥。如果需要,您也可以使用环境变量提供自己的自定义密钥。
主 n8n 实例的加密密钥必须与所有工作器和 webhook 处理器节点共享,以确保这些工作器节点能够访问存储在数据库中的凭证。
在配置文件中或通过设置相应的环境变量为每个工作器节点设置加密密钥:
1 |
|
设置执行模式#
数据库注意事项
n8n 推荐使用 Postgres 13+。不建议在 SQLite 数据库上将 n8n 执行模式设置为 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 |
|
Configure webhook URL#
To configure your webhook URL, execute the following command on the machine running the main n8n instance:
1 |
|
You can also set this value in the configuration file.
Configure load balancer#
When using multiple webhook processes you will need a load balancer to route requests. If you are using the same domain name for your n8n instance and the webhooks, you can set up your load balancer to route requests as follows:
- Redirect any request that matches
/webhook/*
to the webhook servers pool - All other paths (the n8n internal API, the static files for the editor, etc.) should get routed to the main process
Note: The default URL for manual workflow executions is /webhook-test/*
. Make sure that these URLs route to your main process.
You can change this path in the configuration file endpoints.webhook
or using the N8N_ENDPOINT_WEBHOOK
environment variable. If you change these, update your load balancer accordingly.
Disable webhook processing in the main process (optional)#
You have webhook processors to execute the workflows. You can disable the webhook processing in the main process. This will make sure to execute all webhook executions in the webhook processors. In the configuration file set endpoints.disableProductionWebhooksOnMainProcess
to true
so that n8n doesn't process webhook requests on the main process.
Alternatively, you can use the following command:
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 |
多主设置中领导者检查的间隔(秒)。 |
🚀 与作者交流

📚 教程 💡 案例 🔧 技巧

⚡ 快答 🎯 定制 🚀 支持