3. OpenAPI 规范与接口设计:RESTful API 设计原则、任务 CRUD 接口定义、状态查询与回调接口
在构建高性能任务调度平台时,OpenAPI 规范(原 Swagger)不仅是接口文档的标准,更是压测脚本与自动化测试的契约基础。本章将围绕 RESTful 设计原则,定义任务调度平台的核心 CRUD 接口、状态查询机制以及异步回调接口,为后续的压测场景设计奠定精确的请求-响应模型。
3.1 RESTful API 设计原则在调度平台中的落地
任务调度平台本质上是资源管理系统,核心资源是“任务(Task)”。我们严格遵循以下 REST 原则:
- 资源导向 URL:每个任务实例拥有唯一的 URI,如
/api/v1/tasks/{taskId}。 - 使用标准 HTTP 方法:GET(查询)、POST(创建)、PUT(全量更新)、PATCH(部分更新)、DELETE(删除)。
- 无状态交互:服务端不保存客户端上下文,每次请求携带完整认证信息(Token)。
- 统一响应格式:所有接口返回标准 JSON 结构,包含
code、message、data字段。 - 版本控制:URL 前缀携带版本号
/api/v1/,保障向后兼容。
压测视角提示: 无状态设计使得压测时可以随机生成请求参数,无需维护复杂的会话状态,大幅降低脚本复杂度。
3.2 任务 CRUD 接口定义
任务 CRUD 是调度平台最核心的接口集合,也是压测中请求量最大的路径。以下为接口规范与参数定义:
| 方法 | 路径 | 功能描述 | 请求体/参数 | 响应 data 字段 |
|---|---|---|---|---|
| POST | /api/v1/tasks |
创建任务 | { "name", "type", "cronExpr", "payload" } |
{ "taskId": "uuid" } |
| GET | /api/v1/tasks/{taskId} |
查询单个任务详情 | 路径参数 | { "taskId", "name", "status", ... } |
| PUT | /api/v1/tasks/{taskId} |
全量更新任务配置 | { "name", "type", "cronExpr", "payload" } |
{ "updatedAt": "timestamp" } |
| PATCH | /api/v1/tasks/{taskId} |
部分更新(如启用/禁用) | { "status": "disabled" } |
{ "updatedAt": "timestamp" } |
| DELETE | /api/v1/tasks/{taskId} |
删除任务 | 路径参数 | { "deleted": true } |
设计要点: 创建接口返回 201 Created 状态码,查询类返回 200 OK,删除成功返回 204 No Content。压测时需关注不同状态码的响应时间分布。
3.3 状态查询接口
任务状态是调度系统健康度的核心指标。我们设计了批量状态查询与单任务状态查询两个接口,以满足不同压测场景:
- 单任务状态查询:
GET /api/v1/tasks/{taskId}/status,返回当前任务的状态枚举值(pending / running / success / failed / timeout)。 - 批量状态查询:
POST /api/v1/tasks/status/batch,请求体传入{ "taskIds": ["id1","id2"] },返回{ "statusMap": { "id1": "running", "id2": "success" } }。
状态枚举与业务含义对应关系如下:
| 状态值 | 含义 | 压测关注点 |
|---|---|---|
pending |
任务已创建,等待调度 | 高并发下队列积压情况 |
running |
任务正在执行 | 执行器资源占用 |
success |
执行成功 | 正常链路响应时间 |
failed |
执行失败 | 错误处理与重试逻辑 |
timeout |
超时终止 | 超时阈值配置合理性 |
3.4 回调接口设计
任务调度平台采用异步执行模式,任务提交后立即返回 taskId,执行结果通过回调(Callback)机制通知调用方。回调接口由调用方提供,调度平台在任务终态时主动 POST 请求该地址。
回调请求规范如下:
| 项目 | 规范 |
|---|---|
| HTTP 方法 | POST |
| Content-Type | application/json |
| 请求体结构 | { "taskId": "uuid", "status": "success", "result": {}, "executedAt": "2025-01-01T00:00:00Z" } |
| 超时设置 | 调度平台等待回调响应最多 5 秒,超时视为回调失败 |
| 重试策略 | 回调失败后最多重试 3 次,间隔 10 秒 |
| 安全校验 | 回调 URL 需携带签名参数 ?sign=md5(token+taskId+status) |
压测避坑: 回调接口是压测中的“外部依赖”,如果回调地址不可达或响应慢,会导致调度平台线程阻塞。建议在压测环境中使用 Mock 回调服务,或配置回调超时熔断。
3.5 接口安全与认证设计
所有 OpenAPI 接口均需通过 Bearer Token 认证。Token 通过 POST /api/v1/auth/token 获取,有效期 2 小时。压测脚本需在初始化阶段获取 Token,并在后续请求的 Header 中携带:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
接口响应中,认证相关错误码如下:
| HTTP 状态码 | 业务 code | 含义 |
|---|---|---|
| 401 | 1001 | Token 缺失或格式错误 |
| 401 | 1002 | Token 已过期 |
| 403 | 1003 | 无权限访问该资源 |
3.6 接口响应体统一规范
所有 OpenAPI 接口遵循统一的 JSON 响应结构,便于压测脚本进行断言与数据提取:
{
"code": 0,
"message": "success",
"requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"data": {
// 业务数据
}
}
- code:0 表示成功,非 0 表示业务异常,具体错误码见接口文档。
- message:人类可读的错误描述。
- requestId:全局唯一请求 ID,用于链路追踪与压测日志关联。
- data:业务数据载体,类型根据接口不同而变化。
压测脚本技巧: 在 Go 压测脚本中,使用
json.Unmarshal 解析响应体后,优先断言 code == 0,再提取 data 字段。避免直接断言 HTTP 状态码,因为业务错误可能返回 200 但 code 非 0。