任务运行器#
任务运行器是一种通用机制,用于以安全高效的方式执行任务。它们被用来在代码节点中执行用户提供的 JavaScript 代码。
本文档描述了任务运行器的工作原理以及如何配置它们。
工作原理#
任务运行器功能由三个组件组成:任务运行器、任务代理和任务请求者。
任务运行器通过 websocket 连接与任务代理建立连接。任务请求者向代理提交任务请求,可用的任务运行器可以获取该请求并执行。
运行器执行任务并将结果提交给任务请求者。任务代理协调运行器与请求者之间的通信。
n8n 实例(主节点和工作节点)充当代理角色。在这种情况下,代码节点就是任务请求者。
任务运行器模式#
您可以使用两种不同的任务运行器模式:内部模式和外部模式。
内部模式#
在内部模式下,n8n 实例将任务运行器作为子进程启动。n8n 进程监控并管理任务运行器的生命周期。任务运行器进程与 n8n 共享相同的 uid
和 gid
。
外部模式#
在外部模式下,由外部编排器(例如 Kubernetes)而非 n8n 来启动任务运行器。通常,这意味着您需要将任务运行器配置为作为 n8n 旁边的 side-car 容器运行。
在此模式下,编排器监控并管理任务运行器容器的生命周期。任务运行器与 n8n 实例完全隔离。
当使用队列模式时,每个 n8n 容器(主节点和工作节点)都需要有自己的任务运行器。
设置外部模式#
使用以下配置信息来设置外部模式下的任务运行器
配置 n8n 实例为外部模式#
您可以通过设置以下环境变量来配置 n8n 使用外部任务运行器:
环境变量 | 描述 |
---|---|
N8N_RUNNERS_ENABLED=true |
启用任务运行器 |
N8N_RUNNERS_MODE=external |
使用外部模式的任务运行器 |
N8N_RUNNERS_AUTH_TOKEN=<随机安全共享密钥> |
任务运行器用于连接代理的共享密钥 |
N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0 |
默认情况下,任务代理仅监听本地主机。当使用多个容器(例如使用 Docker Compose)时,需要能够接受外部连接 |
完整的环境变量列表请参阅任务运行器环境变量。
配置外部模式下的任务执行器#
任务执行器已内置于 n8n Docker 镜像中。该 Docker 镜像同时包含任务执行器启动器。
启动器可按需启动执行器,这意味着在无需工作时内存占用更低,但冷启动会有短暂延迟(几百毫秒)。启动器还会监控执行器状态,在遇到无限循环或其他问题时自动重启。
通过设置以下属性从 n8n Docker 镜像运行任务执行器容器:
配置项 | 描述 |
---|---|
command |
["/usr/local/bin/task-runner-launcher", "javascript"] |
livenessProbe |
GET /healthz ,端口 5680 |
为容器设置以下环境变量(可根据实际需求调整):
环境变量 | 描述 |
---|---|
N8N_RUNNERS_AUTH_TOKEN=<随机安全共享密钥> |
任务执行器用于连接代理的共享密钥。 |
N8N_RUNNERS_MAX_CONCURRENCY=5 |
执行器可并行处理的任务数量。 |
N8N_RUNNERS_TASK_BROKER_URI=localhost:5679 |
n8n 实例内部任务代理服务器的地址。 |
N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT=15 |
执行器进程在空闲状态下自动关闭前的等待秒数。当有新任务时启动器会自动重新启动执行器。设为 0 可禁用自动关闭功能。 |
NODE_OPTIONS=--max-old-space-size=<内存限制> |
任务执行器 Node.js 进程的内存限制。该值应低于容器内存限制,确保执行器先于容器耗尽内存,这样启动器才能监控执行器状态。 |
GENERIC_TIMEZONE |
与 n8n 实例配置相同的默认时区。 |
完整环境变量列表请参阅任务执行器环境变量。