开始之前
队列模式是自托管的部署方式。在 Docker 里运行 n8n 的基础,自托管那一课已经讲过,这一课从那里接着往下。队列模式页面描述了四个部分:一个 main 实例接收触发器和 webhook,worker 实例负责运行执行,Redis 是消息代理,数据库负责持久化数据。
数据库请用 PostgreSQL。文档说,在 SQLite 上运行队列模式不推荐,分布式部署在 SQLite 上则不受支持。数据库页面写明,截至 2026 年 7 月,支持 PostgreSQL 17 和 18,另外为兼容保留 16。
队列模式多了 Redis、一个共用数据库,以及每个 worker 一个进程,所以先试更轻的办法。在常规模式下,n8n 对并发的生产执行不设上限,并发页面说并发太多会让事件循环抖动。设置 N8N_CONCURRENCY_PRODUCTION_LIMIT 就能把超出的执行留在一个进程里排队。等单个进程成为瓶颈再换成队列模式,不必提前。
一次排队执行是怎么跑的
worker 就是以另一种角色启动的同一个 n8n 程序。文档说,每个 worker 都是独立的 Node.js 实例,可以同时处理多个执行。所有生产执行都在 worker 上运行。webhook 请求仍然先到达 main 实例或 webhook 处理器,由它们把执行交出去,文档提醒这可能增加开销和延迟。
在目前处于抢先体验阶段的 n8n 3.0 里,手动执行也归 worker。破坏性变更页面说,在队列模式下它们总是在 worker 上运行,并删除了 OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS,所以要看看 worker 有多少内存。一次执行的路径分六步:
main 接收触发
main 实例处理定时器和 webhook 调用,生成一次工作流执行,但不运行它。
ID 进入 Redis
它把执行 ID 交给 Redis,Redis 维护待处理执行的队列。
worker 取走任务
池里下一个空闲的 worker 从 Redis 取走消息。
worker 加载工作流
它用执行 ID 从数据库读取工作流信息。
worker 保存结果
运行结束后,它把结果写入数据库,并向 Redis 发出执行已完成的消息。
main 得到通知
Redis 通知 main 实例。
搭起 main、worker 和 Redis
n8n-hosting 仓库里有一套参考部署,包含 Postgres、Redis、一个 main 实例、一个 worker,以及各自的任务运行器 sidecar。下面的片段是从中裁剪出来的,省略的部分有注释标出。这个文件还设置了 OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true,破坏性变更页面把这个变量列为已删除,所以我们把那一行去掉了。
文件里有两个细节。每个进程都要用同一个 N8N_ENCRYPTION_KEY,因为队列模式页面说,worker 需要 main 实例的密钥才能读取存在数据库里的凭据。每个 worker 还要有自己的任务运行器 sidecar,所以文件里把 n8n-worker 和 n8n-worker-runner 配成一对,任务运行器页面有这个要求。不用 Compose 时,用 n8n worker 启动 worker,文档给出的 Docker 写法是 docker run --name n8n-queue -p 5679:5678 n8nio/n8n worker。
x-shared: &shared
restart: always
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_HEALTH_CHECK_ACTIVE=true
- N8N_ENCRYPTION_KEY=${ENCRYPTION_KEY}
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
- N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
# ... database settings, volume and depends_on omitted
services:
# ... x-runner, postgres, redis, n8n and n8n-runner omitted
n8n-worker:
<<: *shared
command: worker
depends_on:
- n8n
n8n-worker-runner:
<<: *runner
environment:
- N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
- N8N_RUNNERS_TASK_BROKER_URI=http://n8n-worker:5679
depends_on:
- n8n-worker- 从 n8n-hosting 仓库复制
docker-compose/withPostgresAndWorker文件夹。 - 启动之前,先改掉它
.env文件里的默认用户、密码和令牌,README 有这个提醒。compose 文件还会读取N8N_VERSION、ENCRYPTION_KEY和RUNNERS_AUTH_TOKEN,这些也要设置。 - 运行
docker compose up -d。 - 在同一个 Docker 网络里的另一个容器中检查 worker。设置了
QUEUE_HEALTH_CHECK_ACTIVE=true后,它 5678 端口上的/healthz/readiness会告诉你数据库和 Redis 的连接是否就绪。 - 发布一个带 Webhook 触发器的工作流,并调用它的生产 URL。这次执行应该在 worker 上运行,而不是在 main 上。
并发、Redis 与超时
worker 默认并行运行十个任务,除非你传入 concurrency 参数,比如 n8n worker --concurrency=5。n8n 建议设成 5 或更高。队列模式页面警告说,worker 很多而并发值很低时,可能耗尽数据库连接池,造成处理延迟和失败。
参数之上还有一个变量。N8N_CONCURRENCY_PRODUCTION_LIMIT 默认是 -1,在队列模式下,只要它是其他值,n8n 就从它取限制。否则退回到参数或参数的默认值,这是并发页面说的。
加 worker 之前先测量。文档报告说,一台 4 GB 的实例每秒最多能处理 220 次执行,但那次测试只用了 Webhook 和 Edit Fields 两个节点,所以你的工作流会不一样。用托管的 Redis 时,QUEUE_BULL_REDIS_TLS 打开 TLS,QUEUE_BULL_REDIS_CLUSTER_NODES 让 n8n 改用 Redis Cluster 客户端,并忽略主机和端口。
| 变量 | 默认值 | 作用 |
|---|---|---|
QUEUE_BULL_REDIS_HOST | localhost | Redis 主机 |
QUEUE_BULL_REDIS_PORT | 6379 | Redis 端口 |
QUEUE_BULL_REDIS_DB | 0 | Redis 数据库 |
QUEUE_BULL_REDIS_TIMEOUT_THRESHOLD | 10000 | Redis 不可用时,n8n 在退出前等待多久,单位毫秒 |
QUEUE_WORKER_LOCK_DURATION | 60000 | worker 对一条消息持有的租约时长,单位毫秒 |
QUEUE_WORKER_LOCK_RENEW_TIME | 10000 | worker 多久续一次租约,单位毫秒 |
QUEUE_WORKER_STALLED_INTERVAL | 30000 | worker 多久检查一次停滞的任务,单位毫秒,0 表示从不检查 |
N8N_GRACEFUL_SHUTDOWN_TIMEOUT | 30 | worker 在进程结束前用来完成任务的秒数 |
QUEUE_HEALTH_CHECK_ACTIVE | false | 打开 worker 的健康检查端点 |
二进制数据与大的 webhook 响应
队列模式页面说,n8n 不支持把二进制数据存在文件系统里的队列模式。接下来文档指向了两个方向。二进制数据处理页面说要改用 database。队列模式页面则指向 S3 外部存储,用于需要保存二进制数据的工作流。两种都在下面的表里。
新的大版本会改掉你脚下的默认值。它删除了内存中的 default 模式,破坏性变更页面说,仍在用它的实例升级时会切换到 filesystem。二进制数据变量页面仍把 default 列为默认值,所以请自己设置 N8N_DEFAULT_BINARY_DATA_MODE。
webhook 响应要装在一条 Redis 消息里,从 worker 传回 main。N8N_WEBHOOK_RESPONSE_RELAY_SIZE_MAX 变量把它限制在 64 MiB,文档建议为每个在途的响应预留约 1.5 倍的 Redis 内存。从 n8n 2.34.0 起,在 worker 上设置 N8N_WEBHOOK_RESPONSE_RELAY_OFFLOAD_ENABLED=true,更大的响应体会存进二进制数据存储,而不是让节点失败。请先升级所有 main 和 webhook 实例,因为旧版本会把存储引用而不是响应体交给客户端。
| 模式 | 与队列模式 | 说明 |
|---|---|---|
filesystem | 不支持 | 队列模式页面说 n8n 不支持它 |
database | 二进制数据处理页面指向它 | N8N_BINARY_DATA_DATABASE_MAX_FILE_SIZE 默认 512 MiB,不能超过 1024,那是数据库一列的上限 |
s3 | 队列模式页面指向它 | 自托管的 Business 或 Enterprise,要有已激活的许可证密钥,还要给存储桶设生命周期规则,因为 n8n 把清理交给 S3 |
azure | 推荐用于大响应 | 许可证要求与 S3 相同,容器上要设生命周期策略来清理 |
default | n8n 3.0 中已删除 | 把二进制数据保存在内存里 |
webhook 处理器与负载均衡器
webhook 处理器是可选的一层,用来扩展接收请求的能力。用 n8n webhook 启动它,并同样设置 EXECUTIONS_MODE=queue。它和 main 监听同一个端口,默认是 5678,前面放负载均衡器。文档建议不要把 main 实例放进这个池,因为那里的重负载会拖慢编辑器。
在 main 实例上把 N8N_WEBHOOK_URL 设成你对外的 webhook URL。它从 n8n 2.30.0 起可用。旧的 WEBHOOK_URL 作为别名仍然有效,但端点页面说它从 2.35.0 起已弃用,启动时会在日志里给出警告。想让 main 完全不处理生产 webhook,就设置 N8N_DISABLE_PRODUCTION_MAIN_PROCESS=true,并且别把 main 放进 webhook 池。
| 路径 | 转发给 | 承载什么 |
|---|---|---|
/webhook/* | webhook 处理器池 | Webhook 触发器节点的端点 |
/webhook-waiting/* | webhook 处理器池 | “发送并等待”类节点的人工介入端点,比如 Slack 节点 |
/webhook-test/* | main 实例 | 手动执行使用的默认 URL |
| 其余所有路径 | main 实例 | 内部 API 和编辑器文件 |
多 main 与高可用
单个 main 实例有两类工作。一类是常规任务,比如 API、界面和 webhook,另一类是至多执行一次的任务,比如定时器、轮询和清理。多 main 同时运行多个 main 实例来实现高可用。文档把角色分成两种:follower 负责常规任务,一个 leader 两类任务都负责,leader 不可用时由 follower 接手。
- 这是自托管 Enterprise 才有的功能,n8n Cloud 上没有。
- 每个 main 都运行在队列模式下,连接 Postgres 和 Redis,并设置
N8N_MULTI_MAIN_SETUP_ENABLED=true。 - 所有 main 和 worker 进程运行同一个 n8n 版本。
- main 们放在启用了会话保持(sticky sessions)的负载均衡器后面。
- leader 键默认存活 10 秒,leader 检查默认每 3 秒一次,分别由
N8N_MULTI_MAIN_SETUP_KEY_TTL和N8N_MULTI_MAIN_SETUP_CHECK_INTERVAL设置。
n8n 团队和 n8n Helm chart 怎么说规模化运行
2026 年 6 月 9 日,n8n 团队在 X 上宣布原生支持 OpenTelemetry。帖子的理由是,工作流如今在跑支付、客服、CRM 同步和 AI 智能体,出了问题,理应和其他服务一样看得清楚。worker 分散在多台机器上时,链路追踪让你在一个地方跟住每次执行。
n8n 的 OpenTelemetry 页面说,n8n 可以通过 OTLP 把工作流和节点的执行追踪导出到 OpenTelemetry collector。N8N_OTEL_ENABLED 默认关闭,从 n8n 2.19.0 起可用,N8N_OTEL_TRACES_INCLUDE_NODE_SPANS 决定是否包含节点的 span。
跑在 Kubernetes 上的话,可以看 GitHub 上由 8gears 维护的 n8n Helm chart。它的 README 说,chart 默认启动两个 worker 实例,由 scaling.worker.replicaCount 控制,但默认不启动 Redis。打开 scaling.webhook.enabled 后,main 实例就不再处理 webhook。
出了问题时,你应该拥有和其他任何服务一样的可见性。
X 官方嵌入卡片的截图,拍摄于 2026 年 11 月 5 日,时间为 UTC。X 用“Show more”截断了帖子后面的内容。点击截图可到 X 上打开原帖。
常见错误
- worker 用了自己的加密密钥。文档说,main 实例的密钥必须交给每个 worker 和 webhook 处理器,否则它们读不了存在数据库里的凭据。
- webhook 处理器上漏了
EXECUTIONS_MODE=queue。文档说,webhook 进程依赖 Redis,也需要设置这个变量。 - 还在设置
OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS或QUEUE_WORKER_MAX_STALLED_COUNT。破坏性变更页面删除了前者,后者从 n8n 2.0 起就没有任何作用。变量页面仍然列着这两个变量。 - 多个 worker 共用一个任务运行器 sidecar,或者运行器镜像的版本不一致。每个 worker 都要有自己的 sidecar,
n8nio/runners镜像要和n8nio/n8n镜像的版本一致。 - 在已有的数据卷上把 Postgres 镜像从 16 升到 18。README 说它会报 “FATAL: database files are incompatible with server” 并停止,还提醒你保留文件里的
PGDATA那一行。 - 在队列模式实例的生产环境里给聊天智能体用 Simple Memory。Simple Memory 页面说它在那里不能用,请改用 Redis Chat Memory 或 Postgres Chat Memory,AI 智能体那一课有演示。
- 让多个 worker 指向同一个事件日志文件。日志流页面说,worker 共用一个可写文件系统时,要给每个进程设自己的
N8N_EVENTBUS_LOGWRITER_LOGFULLPATH,也就是以.log结尾的绝对路径。
自己试一试
- 用你自己的密钥把参考部署跑起来,用生产 URL 调用一个 webhook 工作流,并在编辑器里打开这次执行。
- 在 worker 命令里加上
--concurrency=5,比较同时运行的执行数。 - 停掉 worker 容器,触发一次 webhook,记下在你重新启动 worker 之前,这次执行是什么状态。
- 在 Docker 网络里读取 worker 的
/healthz/readiness,然后停掉 Redis,再读一次。
下一门课:Dify
这是 n8n 进阶课的最后一课。下一门课 Dify 教程讲怎样在 Dify 里搭建 AI 应用和工作流,Dify 是一个专门用来构建大模型应用的平台,自带知识库和智能体。想让新搭好的 n8n 环境派上用场,可以从 n8n 工作流目录里选一个现成的工作流,按导入指南的做法导入。
自测一下
除了 main 实例和 worker,n8n 的队列模式还需要什么?
查看答案
D. 作为消息代理的 Redis 和一个 Postgres 数据库 Redis 保存队列,数据库持久化数据,所以两者都必须能访问,而且在 SQLite 上搭分布式部署是不受支持的。
worker 打不开 main 实例保存的凭据。你应该先检查什么?
查看答案
A. 它用的是不是同一个 N8N_ENCRYPTION_KEY main 实例的密钥必须交给每个 worker 和 webhook 处理器,它们才能读取保存的凭据。
队列模式下,n8n 不支持哪种二进制数据模式?
查看答案
C. filesystem 队列模式页面说,n8n 不支持把二进制数据存在文件系统里的队列模式。
你把 webhook 处理器放在了负载均衡器后面。哪个路径要留在 main 实例上?
查看答案
B. /webhook-test/* webhook 和 webhook-waiting 路径转发给处理器池,手动执行用的测试 URL 则留在 main 上。
常见问题
n8n 队列模式需要 Redis 和 Postgres 吗?
需要。Redis 充当消息代理,数据库负责持久化数据,所以两者都必须能访问。文档说,在 SQLite 上搭分布式部署是不受支持的。
我需要多少个 worker?
文档没有给公式。一个 worker 默认同时运行十个任务,n8n 建议并发数设成 5 或更高。文档的基准测试用了四个 worker 和两个 webhook 实例,你要按自己的峰值负载来估算。
没有 Enterprise 许可证能用多 main 吗?
不能。文档把多 main 列为自托管 Enterprise 功能,n8n Cloud 上也没有。一个 main 加多个 worker 的部署不需要这个许可证。
队列模式下二进制数据放哪里?
不能放在文件系统里,n8n 在那里不支持它。请用 database 模式,或者在自托管的 Business 或 Enterprise 许可证下用 S3 或 Azure Blob 存储。新的大版本删除了内存中的默认模式。
worker 运行 Code 节点需要任务运行器吗?
外部模式下需要。每个 worker 都要有自己的任务运行器 sidecar,所以参考 compose 文件里有 n8n-worker-runner 这个服务。内部模式已被弃用。
队列模式下手动测试运行在哪里执行?
在新的大版本里,它们总是在 worker 上运行,OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS 这个设置也没有了。测试用的 webhook URL 仍然路由到 main 实例。
资料来源
- n8n Docs: Enable queue mode https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/enable-queue-mode
- n8n Docs: Queue mode environment variables https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/queue-mode
- n8n Docs: Control concurrency https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/control-concurrency
- n8n Docs: Measure performance https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/measure-performance
- n8n Docs: Handle binary data https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/handle-binary-data
- n8n Docs: Binary data environment variables https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/binary-data
- n8n Docs: Use external storage https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/use-external-storage
- n8n Docs: Choose your n8n database https://docs.n8n.io/deploy/host-n8n/configure-n8n/choose-n8ns-database
- n8n Docs: Set up task runners https://docs.n8n.io/deploy/host-n8n/configure-n8n/set-up-task-runners
- n8n Docs: v3.0 breaking changes https://docs.n8n.io/changelog/v30-breaking-changes
- n8n-hosting repository: Postgres and worker compose file https://github.com/n8n-io/n8n-hosting/blob/main/docker-compose/withPostgresAndWorker/docker-compose.yml
- n8n-hosting repository: Postgres and worker README https://github.com/n8n-io/n8n-hosting/blob/main/docker-compose/withPostgresAndWorker/README.md
- n8n Docs: Simple Memory node https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.memorybufferwindow
- n8n Docs: Stream logs to external systems https://docs.n8n.io/administer/observe-and-log/stream-logs-to-external-systems
- n8n Docs: Executions environment variables https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/executions
- n8n Docs: Endpoints environment variables https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/endpoints
- n8n Docs: OpenTelemetry environment variables https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/opentelemetry
- n8n.io on X: n8n now supports OpenTelemetry natively, 9 June 2026 https://x.com/n8n_io/status/2064271339179897307
- 8gears on GitHub: n8n Helm chart https://github.com/8gears/n8n-helm-chart

