# scheduler-backend 独立的调度中心后端工程,负责: - 管理 API - 本地 Go handler 注册 - 手动执行 - `gocron` 定时执行 - MongoDB 中的任务配置与执行记录存储 ## 当前能力 - `GET /admin/scheduler/handlers` - `GET /admin/scheduler/jobs` - `GET /admin/scheduler/jobs/:id` - `POST /admin/scheduler/jobs` - `PUT /admin/scheduler/jobs/:id` - `POST /admin/scheduler/jobs/:id/toggle` - `POST /admin/scheduler/jobs/:id/run` - `GET /admin/scheduler/executions` ## 目录结构 ```text cmd/api 管理 API 入口 cmd/worker 调度执行入口 internal/api Gin 路由 internal/executor 本地 handler 执行 internal/jobdef handler 定义与注册 internal/scheduler gocron 调度服务 internal/store/model Mongo 文档模型 internal/store/mongo Mongo 连接与存储实现 pkg/config 环境配置加载 pkg/log 日志封装 ``` ## 环境变量 默认会按下面顺序读取: 1. `.env` 2. `.env.` 3. `.env.local` 外部进程环境变量优先级更高,不会被文件覆盖。 关键变量: ```env HTTP_PORT=16811 WORKER_HTTP_PORT=16812 MONGO_HOST=47.237.103.4 MONGO_PORT=27017 MONGO_USERNAME= MONGO_PASSWORD= MONGO_AUTHSOURCE=admin MONGO_DATABASE=openim_v3 SCHEDULER_MONGO_DATABASE=scheduler_center REDIS_ADDR=127.0.0.1:6379 REDIS_USERNAME= REDIS_PASSWORD= ``` ## 启动方式 ### 一条命令启动后端 ```bash cd /Users/vet/all/workspace414/scheduler-backend ./start.sh ``` 这个脚本会同时启动: - `api` - `worker` 并把运行信息写到: - `logs/api.log` - `logs/worker.log` PID 文件会写到: - `run/api.pid` - `run/worker.pid` 停止方式: ```bash cd /Users/vet/all/workspace414/scheduler-backend ./stop.sh ``` ### 启动 API ```bash cd /Users/vet/all/workspace414/scheduler-backend GOWORK=off go run ./cmd/api ``` 或直接运行: ```bash ./scripts/start-api.sh ``` 默认监听: ```text http://127.0.0.1:16811 ``` ### 启动 worker ```bash cd /Users/vet/all/workspace414/scheduler-backend GOWORK=off go run ./cmd/worker ``` 或直接运行: ```bash ./scripts/start-worker.sh ``` worker 会: - 连接 Mongo - 暴露健康检查端口 `http://127.0.0.1:16812/healthz` - 加载启用任务 - 跳过 `manual` - 注册 `cron` 和 `interval` - 到点写执行记录并执行本地 Go handler ## 初始化示例任务 会向 `scheduler_center.job_configs` 写入一条示例任务: - `name=sample-job` - `handlerKey=sample-handler` - `enabled=false` - `scheduleType=manual` - `defaultParams={"limit":10,"dryRun":true}` 运行方式: ```bash cd /Users/vet/all/workspace414/scheduler-backend GOWORK=off go run ./cmd/tools/seed-sample-job ``` 或直接运行: ```bash ./scripts/seed-sample-job.sh ``` ## 测试与构建 ```bash cd /Users/vet/all/workspace414/scheduler-backend GOWORK=off go test ./pkg/config ./internal/jobdef ./internal/store/model ./internal/executor -v GOWORK=off go build ./cmd/api ./cmd/worker ./cmd/tools/seed-sample-job ``` ## 当前限制 - 只支持本地 Go handler - `interval` 依赖 `time.ParseDuration`,例如 `30s`、`5m`、`1h` - 没有审批流 - 没有分布式多 worker 协调 - 执行记录详情页接口还没单独拆出