graphile-worker 是一个基于 Node.js 和 PostgreSQL 的高性能任务队列,允许在后台运行各类任务(如发送邮件、执行计算、生成PDF等),避免阻塞HTTP响应或应用代码。它可与任何PostgreSQL支持的应用配合使用,尤其适合与PostGraphile或PostgREST搭配。
bash# 基本用法(使用环境变量指定数据库连接) docker run -d \ -e DATABASE_URL="postgres://user:password@postgres-host:5432/mydb?ssl=true" \ -v ./tasks:/app/tasks \ --name graphile-worker \ graphile/worker:latest # 仅初始化数据库 schema docker run --rm \ -e DATABASE_URL="postgres://user:password@postgres-host:5432/mydb" \ graphile/worker:latest \ --schema-only # 单次运行模式(执行完所有可运行任务后退出) docker run --rm \ -e DATABASE_URL="postgres://user:password@postgres-host:5432/mydb" \ -v ./tasks:/app/tasks \ graphile/worker:latest \ --once
yamlversion: '3.8' services: postgres: image: postgres:13 environment: POSTGRES_USER: worker_user POSTGRES_PASSWORD: worker_password POSTGRES_DB: worker_db volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U worker_user -d worker_db"] interval: 5s timeout: 5s retries: 5 worker: image: graphile/worker:latest depends_on: postgres: condition: service_healthy environment: DATABASE_URL: "postgres://worker_user:worker_password@postgres:5432/worker_db" # 可选环境变量 # CONCURRENCY: 5 # 并发任务数 # POLL_INTERVAL: 1000 # 轮询间隔(ms) volumes: - ./tasks:/app/tasks # 挂载任务目录 restart: always volumes: postgres_data:
任务需定义在任务目录(默认tasks/)中的JS文件,文件名即为任务标识符。
示例任务文件(tasks/hello.js):
javascript// tasks/hello.js module.exports = async (payload, helpers) => { const { name } = payload; helpers.logger.info(`Hello, ${name}`); };
bash# 基本启动(使用环境变量DATABASE_URL和默认任务目录/tasks) docker run -e DATABASE_URL="postgres:///my_db" -v ./tasks:/app/tasks graphile/worker:latest # 指定数据库连接字符串和并发数 docker run -v ./tasks:/app/tasks graphile/worker:latest -c "postgres://user:pass@host:port/db?ssl=true" -j 5 # 定时任务模式(指定crontab文件) docker run -v ./tasks:/app/tasks -v ./crontab:/app/crontab graphile/worker:latest --crontab /app/crontab
javascriptconst { run, quickAddJob } = require("graphile-worker"); async function main() { // 启动工作进程 const runner = await run({ connectionString: "postgres:///my_db", concurrency: 5, // 并发数 noHandleSignals: false, // 处理系统信号(SIGINT, SIGTERM等)以优雅关闭 pollInterval: 1000, // 轮询间隔(ms) taskList: { hello: async (payload, helpers) => { const { name } = payload; helpers.logger.info(`Hello, ${name}`); }, }, }); // 添加任务 await quickAddJob( { connectionString: "postgres:///my_db" }, "hello", // 任务标识符 { name: "Bobby Tables" } // 任务参数 ); // 等待工作进程完成 await runner.promise; } main().catch((err) => { console.error(err); process.exit(1); });
连接PostgreSQL数据库执行以下SQL:
sql-- 添加任务 SELECT graphile_worker.add_job('hello', json_build_object('name', 'Bobby Tables')); -- 添加定时任务(5分钟后执行) SELECT graphile_worker.add_job( 'hello', json_build_object('name', 'Bobby Tables'), run_at => NOW() + INTERVAL '5 minutes' );
javascriptconst { makeWorkerUtils } = require("graphile-worker"); async function addTask() { const workerUtils = await makeWorkerUtils({ connectionString: "postgres:///my_db", }); try { // 添加任务 await workerUtils.addJob( "hello", // 任务标识符 { name: "Bobby Tables" }, // 任务参数 { queueName: "greetings", // 队列名称(同名队列串行执行) priority: 10, // 优先级(数值越小优先级越高) runAt: new Date(Date.now() + 5000), // 5秒后执行 maxAttempts: 5, // 最大重试次数 jobKey: "unique-hello-bobby" // 任务去重键 } ); } finally { await workerUtils.release(); } } addTask().catch(console.error);
| 环境变量 | 描述 | 默认值 |
|---|---|---|
| DATABASE_URL | PostgreSQL连接字符串 | - |
| GRAPHILE_LOGGER_DEBUG | 是否启用调试日志 | 0 |
Options: --help 显示帮助信息 --version 显示版本号 -c, --connection 数据库连接字符串,默认使用DATABASE_URL环境变量 -s, --schema 数据库模式(graphile-worker元数据存储位置) [默认: "graphile_worker"] --schema-only 仅安装/更新数据库模式,然后退出 --once 执行完所有可运行任务后退出 -w, --watch 开发模式:监听任务文件变化(实验性) --crontab 指定crontab文件路径 -j, --jobs 并发任务数 [默认: 1] -m, --max-pool-size PostgreSQL连接池最大大小 [默认: 10] --poll-interval 轮询间隔(毫秒) [默认: 2000] --no-prepared-statements 禁用预编译语句(如用于pgBouncer兼容)
来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429