Mindket
n8n 进阶课第 4 节,共 4 节

n8n 队列模式:Redis、worker、并发与扩展

黑色横幅,标题是“n8n 进阶”,下面是“错误处理、子工作流、代码与扩展”。

n8n 队列模式把工作分给 main 实例、Redis 和 worker 进程。main 实例接收触发器和 webhook,把每次执行放进 Redis 排队,由 worker 取出并运行。它需要 PostgreSQL、Redis、一把共用的加密密钥,以及一种不是 filesystem 的二进制数据模式。worker 默认同时运行 10 个任务。

本节内容

  • 知道队列模式什么时候值得多出这些活动部件。
  • 让 main、Redis、Postgres 和 worker 共用同一把加密密钥。
  • 调好 worker 并发数和几个关键的 Redis 设置。
  • 选一种能配合多个 worker 的二进制数据模式。
  • 把 webhook 路由给处理器,并了解多 main 的要求。
全部课程
本页目录
  1. 开始之前
  2. 一次排队执行是怎么跑的
  3. 搭起 main、worker 和 Redis
  4. 并发、Redis 与超时
  5. 二进制数据与大的 webhook 响应
  6. webhook 处理器与负载均衡器
  7. 多 main 与高可用
  8. n8n 团队和 n8n Helm chart 怎么说规模化运行
  9. 常见错误
  10. 自己试一试
  11. 下一门课:Dify
  12. 自测一下
  13. 常见问题
  14. 资料来源

开始之前

队列模式是自托管的部署方式。在 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 有多少内存。一次执行的路径分六步:

一次执行,从触发到出结果
  1. main 接收触发

    main 实例处理定时器和 webhook 调用,生成一次工作流执行,但不运行它。

  2. ID 进入 Redis

    它把执行 ID 交给 Redis,Redis 维护待处理执行的队列。

  3. worker 取走任务

    池里下一个空闲的 worker 从 Redis 取走消息。

  4. worker 加载工作流

    它用执行 ID 从数据库读取工作流信息。

  5. worker 保存结果

    运行结束后,它把结果写入数据库,并向 Redis 发出执行已完成的消息。

  6. 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
  1. 从 n8n-hosting 仓库复制 docker-compose/withPostgresAndWorker 文件夹。
  2. 启动之前,先改掉它 .env 文件里的默认用户、密码和令牌,README 有这个提醒。compose 文件还会读取 N8N_VERSION、ENCRYPTION_KEY 和 RUNNERS_AUTH_TOKEN,这些也要设置。
  3. 运行 docker compose up -d。
  4. 在同一个 Docker 网络里的另一个容器中检查 worker。设置了 QUEUE_HEALTH_CHECK_ACTIVE=true 后,它 5678 端口上的 /healthz/readiness 会告诉你数据库和 Redis 的连接是否就绪。
  5. 发布一个带 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 客户端,并忽略主机和端口。

n8n 扩展页面里的数字

220

文档报告的每秒执行次数,条件是一台 4 GB 实例,运行一个 Webhook 加一个 Edit Fields 节点

来源:n8n 文档:测量性能 (2026年11月4日 查阅)

10

worker 默认并行运行的任务数

来源:n8n 文档:启用队列模式 (2026年11月4日 查阅)

5

n8n 建议的最低 worker 并发数

来源:n8n 文档:启用队列模式 (2026年11月4日 查阅)

64 MiB

worker 默认通过 Redis 转发的 webhook 响应的最大体积

来源:n8n 文档:队列模式环境变量 (2026年11月4日 查阅)

出自队列模式变量页面和队列模式页面。
变量默认值作用
QUEUE_BULL_REDIS_HOSTlocalhostRedis 主机
QUEUE_BULL_REDIS_PORT6379Redis 端口
QUEUE_BULL_REDIS_DB0Redis 数据库
QUEUE_BULL_REDIS_TIMEOUT_THRESHOLD10000Redis 不可用时,n8n 在退出前等待多久,单位毫秒
QUEUE_WORKER_LOCK_DURATION60000worker 对一条消息持有的租约时长,单位毫秒
QUEUE_WORKER_LOCK_RENEW_TIME10000worker 多久续一次租约,单位毫秒
QUEUE_WORKER_STALLED_INTERVAL30000worker 多久检查一次停滞的任务,单位毫秒,0 表示从不检查
N8N_GRACEFUL_SHUTDOWN_TIMEOUT30worker 在进程结束前用来完成任务的秒数
QUEUE_HEALTH_CHECK_ACTIVEfalse打开 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 相同,容器上要设生命周期策略来清理
defaultn8n 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 触发器节点的端点
/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。

出了问题时,你应该拥有和其他任何服务一样的可见性。

n8n.io, n8n 的官方账号,引文为译文 · X (2026年11月5日 查阅)
n8n.io(@n8n_io)2026 年 6 月 9 日在 X 上的帖子:n8n 现在原生支持 OpenTelemetry。你的工作流不再是副业项目,而是跑着支付、客服、CRM 同步和 AI 智能体的生产系统。出了问题时,你应该拥有和其他任何服务一样的可见性。
n8n.io 在 X 上,2026 年 6 月 9 日

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 工作流目录里选一个现成的工作流,按导入指南的做法导入。

自测一下

  1. 除了 main 实例和 worker,n8n 的队列模式还需要什么?

    查看答案

    D. 作为消息代理的 Redis 和一个 Postgres 数据库 Redis 保存队列,数据库持久化数据,所以两者都必须能访问,而且在 SQLite 上搭分布式部署是不受支持的。

  2. worker 打不开 main 实例保存的凭据。你应该先检查什么?

    查看答案

    A. 它用的是不是同一个 N8N_ENCRYPTION_KEY main 实例的密钥必须交给每个 worker 和 webhook 处理器,它们才能读取保存的凭据。

  3. 队列模式下,n8n 不支持哪种二进制数据模式?

    查看答案

    C. filesystem 队列模式页面说,n8n 不支持把二进制数据存在文件系统里的队列模式。

  4. 你把 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 实例。

资料来源

  1. n8n Docs: Enable queue mode (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/enable-queue-mode
  2. n8n Docs: Queue mode environment variables (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/queue-mode
  3. n8n Docs: Control concurrency (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/control-concurrency
  4. n8n Docs: Measure performance (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/measure-performance
  5. n8n Docs: Handle binary data (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/handle-binary-data
  6. n8n Docs: Binary data environment variables (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/binary-data
  7. n8n Docs: Use external storage (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/use-external-storage
  8. n8n Docs: Choose your n8n database (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/choose-n8ns-database
  9. n8n Docs: Set up task runners (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/set-up-task-runners
  10. n8n Docs: v3.0 breaking changes (2026年11月4日 查阅)https://docs.n8n.io/changelog/v30-breaking-changes
  11. n8n-hosting repository: Postgres and worker compose file (2026年11月4日 查阅)https://github.com/n8n-io/n8n-hosting/blob/main/docker-compose/withPostgresAndWorker/docker-compose.yml
  12. n8n-hosting repository: Postgres and worker README (2026年11月4日 查阅)https://github.com/n8n-io/n8n-hosting/blob/main/docker-compose/withPostgresAndWorker/README.md
  13. n8n Docs: Simple Memory node (2026年11月4日 查阅)https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.memorybufferwindow
  14. n8n Docs: Stream logs to external systems (2026年11月4日 查阅)https://docs.n8n.io/administer/observe-and-log/stream-logs-to-external-systems
  15. n8n Docs: Executions environment variables (2026年11月4日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/executions
  16. n8n Docs: Endpoints environment variables (2026年11月5日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/endpoints
  17. n8n Docs: OpenTelemetry environment variables (2026年11月5日 查阅)https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/opentelemetry
  18. n8n.io on X: n8n now supports OpenTelemetry natively, 9 June 2026 (2026年11月5日 查阅)https://x.com/n8n_io/status/2064271339179897307
  19. 8gears on GitHub: n8n Helm chart (2026年11月5日 查阅)https://github.com/8gears/n8n-helm-chart

分享本节课

把工作流导入你的队列环境

在 Mindket 选一个现成的 n8n 工作流,在实时预览里看看它的节点,再导入你刚搭好的实例。

浏览 n8n 工作流

本节课的 Markdown 版本 · n8n 进阶课 · 全部课程