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 超时终止 超时阈值配置合理性
任务状态机流转图 pending running success failed timeout 状态转换说明 pending → running 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 无权限访问该资源
OpenAPI 接口认证与调用流程 压测客户端 认证服务 调度 API 回调服务 1. 获取Token 2. 携带Token请求 3. 异步回调 压测请求链路时序 ① 压测客户端先调用认证服务获取 Token → ② 携带 Token 调用调度 API 创建/查询任务 → ③ 任务执行完成后,调度平台主动回调客户端提供的回调地址

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。