队列模式
您可以根据需要以不同模式运行 n8n。队列模式提供最佳的可扩展性。
工作原理
在队列模式下运行时,您可以设置多个 n8n 实例,其中一个主实例接收工作流信息(例如触发器),而工作实例执行执行。
每个工作者都是其自己的 Node.js 实例,以模式运行,但由于其高 IOPS(每秒输入输出操作)而能够处理多个同时的工作流程执行。
通过使用工作实例并以队列模式运行,您可以根据需要扩大 n8n(通过添加工作器)和缩小 n8n(通过删除工作器)来处理工作负载。
这是流程:
- 主 n8n 实例处理计时器和 webhook 调用,生成(但不运行)工作流执行。
- 它将执行 ID 传递给消息代理Redis ,该代理维护待执行的队列并允许下一个可用的工作人员接收它们。
- 池中的工作人员从 Redis 获取消息。
- 工作者使用执行ID从数据库中获取工作流信息。
- 完成工作流执行后,工作器将:
- 将结果写入数据库。
- 将结果发布到 Redis,告知执行已完成。
- Redis 通知主实例。
配置工作者
Worker 是执行实际工作的 n8n 实例。它们从主 n8n 进程接收有关需要执行的工作流的信息,执行工作流,并在每次执行完成后更新状态。
设置加密密钥
n8n 首次启动时会自动生成加密密钥。您也可以根据需要使用
环境变量提供自定义密钥。主 n8n 实例的加密密钥必须与所有工作节点和 webhooks 处理器节点共享,以确保这些工作节点能够访问存储在数据库中的凭据。
在
配置文件中或通过设置相应的环境变量为每个工作节点设置加密密钥:1 | |
设置执行模式
数据库注意事项
n8n 建议使用 Postgres 13+。不建议将执行模式设置为 SQLite 数据库来运行 n8n。
使用以下命令将环境变量设置为主实例和任何工作实例。
1 | |
或者,您可以在
配置文件中设置为。启动 Redis
在单独的机器上运行 Redis
您可以在单独的机器上运行 Redis,只需确保 n8n 实例可以访问它。
要在 Docker 容器中运行 Redis,请按照以下说明操作:
运行以下命令启动 Redis 实例:
1 | |
默认情况下,Redis 在端口上运行,无需密码。根据您的 Redis 配置,为主 n8n 进程设置以下配置。这些配置将允许 n8n 与 Redis 交互。
| 使用配置文件 | 使用环境变量 | 描述 |
|---|---|---|
queue.bull.redis.host:localhost |
QUEUE_BULL_REDIS_HOST=localhost |
默认情况下,Redis 在 上运行。 |
queue.bull.redis.port:6379 |
QUEUE_BULL_REDIS_PORT=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 |
默认值为。如果更改此值,请更新配置。 |
queue.bull.redis.timeoutThreshold:10000ms |
QUEUE_BULL_REDIS_TIMEOUT_THRESHOLD |
告知 n8n 如果 Redis 不可用,在退出前应等待多长时间。默认值为(ms)。 |
queue.bull.gracefulShutdownTimeout:30 |
N8N_GRACEFUL_SHUTDOWN_TIMEOUT |
工作进程在终止进程之前完成作业执行的正常关闭超时时间。默认值为秒。 |
现在您可以启动您的 n8n 实例,它将连接到您的 Redis 实例。
启动工人
您需要启动工作进程,以便 n8n 执行工作流。如果您想在单独的计算机上托管工作进程,请在该计算机上安装 n8n,并确保它已连接到您的 Redis 实例和 n8n 数据库。
通过从根目录运行以下命令来启动工作进程:
1 | |
如果您使用 Docker,请使用以下命令:
1 | |
您可以设置多个工作进程。请确保所有工作进程都可以访问 Redis 和 n8n 数据库。
工作服务器
每个工作进程运行一个公开可选端点的服务器:
查看正在运行的工作者
功能可用性
- 适用于自托管企业计划。
- 如果您想在 Cloud Enterprise 上访问此功能,请联系 n8n 。
您可以通过选择
“设置” > “工作者”在 n8n 中查看正在运行的工作者及其性能指标。使用队列运行 n8n
当使用队列运行 n8n 时,所有生产工作流的执行都会由工作进程处理。这意味着即使是 webhook 调用也会被委托给工作进程,这可能会增加一些开销和额外的延迟。
Redis 充当消息代理,数据库用于持久化数据,因此需要同时访问这两者。不支持通过 SQLite 运行采用此设置的分布式系统。
Webhook 处理器
Webhook 处理器是 n8n 中的另一层扩展功能。配置 Webhook 处理器是可选的,它允许您扩展传入的 Webhook 请求。
这种方法允许 n8n 处理大量并行请求。您只需相应地添加更多 webhook 进程和工作线程即可。webhook 进程将在同一端口(默认值: )上监听请求。在容器或单独的机器中运行这些进程,并使用负载均衡系统相应地路由请求。
n8n 不建议将主进程添加到负载均衡器池中。如果将主进程添加到池中,它将接收请求,并可能产生高负载。这将导致编辑、查看以及与 n8n UI 交互的性能下降。
您可以通过从根目录执行以下命令来启动 webhook 处理器:
1 | |
如果您使用 Docker,请使用以下命令:
1 | |
配置 webhook URL
要配置您的 webhook URL,请在运行主 n8n 实例的机器上执行以下命令:
1 | |
您也可以在配置文件中设置该值。
配置负载均衡器
使用多个 webhook 进程时,您需要一个负载均衡器来路由请求。如果您的 n8n 实例和 webhook 使用相同的域名,则可以按如下方式设置负载均衡器来路由请求:
- 将匹配的任何请求重定向到 webhook 服务器池
- 所有其他路径(n8n 内部 API、编辑器的静态文件等)都应路由到主进程
您可以在配置文件中或使用环境变量更改此路径。如果您更改了这些设置,请相应地更新您的负载均衡器。
在主进程中禁用 webhook 处理(可选)
您有 webhook 处理器来执行工作流。您可以在主进程中禁用 webhook 处理。这将确保所有 webhook 操作都在 webhook 处理器中执行。在配置文件中设置为,这样 n8n 就不会在主进程中处理 webhook 请求。
或者,您可以使用以下命令:
1 | |
在主进程中禁用webhook进程时,运行主进程,并且不要将其添加到负载均衡器的webhook池中。
配置工作器并发
您可以使用标志来定义一个工作器可以并行运行的作业数量。默认值为。要更改它:
1 | |
并发和扩展建议
n8n 建议将工作线程实例的并发度设置为 5 或更高。如果工作线程数量较多,且设置较低的并发度值,可能会耗尽数据库的连接池,从而导致处理延迟和失败。
多主设置
功能可用性
- 适用于自托管企业计划。
在队列模式下,您可以运行多个进程以实现高可用性。
在单模式设置中,该过程执行两组任务:
- 常规任务,例如运行 API、提供 UI 和监听 webhook,以及
- 最多一次任务,例如运行非 HTTP 触发器(计时器、轮询器和 RabbitMQ 和 IMAP 等持久连接)以及修剪执行和二进制数据。
在多主设置中,有两种进程:
- 追随者,运行常规任务,以及
- 领导者,运行常规任务和最多一次任务。
领导者指定
在多主服务器设置中,所有主服务器实例都以对用户透明的方式处理领导进程。如果当前领导者不可用(例如崩溃或其事件循环过于繁忙),其他追随者可以接管。如果之前的领导者恢复响应,它就会成为追随者。
配置多主设置
要在多主设置中部署 n8n,请确保:
- 所有进程都以队列模式运行,并连接到Postgres和Redis。
- 所有进程都运行相同版本的 n8n。
- 所有进程均已将环境变量设置为。
- 所有进程都在启用会话持久性(粘性会话)的负载均衡器后面运行。
如果需要,您可以调整领导者关键选项:
| 使用配置文件 | 使用环境变量 | 描述 |
|---|---|---|
multiMainSetup.ttl:10 |
N8N_MULTI_MAIN_SETUP_KEY_TTL=10 |
多主设置中领导者密钥的生存时间(以秒为单位)。 |
multiMainSetup.interval:3 |
N8N_MULTI_MAIN_SETUP_CHECK_INTERVAL=3 |
多主设置中领导者检查的间隔(以秒为单位)。 |
