Files
scheduler-backend/README.md
2026-05-28 13:29:24 +08:00

174 lines
3.2 KiB
Markdown

# 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.<APP_ENV|GO_ENV|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 协调
- 执行记录详情页接口还没单独拆出