2. Go任务调度平台架构概览:整体架构图、核心组件与OpenAPI设计
在开始压测之前,必须清晰理解目标系统的架构。本章将拆解基于Go构建的任务调度平台,从整体架构图、核心组件(调度器、执行器、存储层)到API网关与OpenAPI设计,为后续的压测场景设计奠定基础。
2.1 整体架构图
平台采用经典的分层微服务架构,从上至下依次为:接入层、调度控制层、执行层与存储层。各层职责明确,通过轻量级通信协议解耦。
架构要点: 调度器与执行器通过etcd进行服务发现与心跳检测,执行器无状态化设计,便于水平扩展。API网关统一处理外部请求,内部服务间通信采用gRPC,降低延迟。
2.2 核心组件详解
2.2.1 调度器 (Scheduler)
调度器是整个平台的“大脑”,负责解析任务定义、触发时间策略、分发任务到合适的执行器,并监控任务生命周期。其核心职责包括:
- 任务解析与编排: 支持Cron表达式、固定间隔、依赖触发等多种调度模式。
- 分布式协调: 基于etcd实现Leader选举,确保同一时刻只有一个调度器实例在运行,避免任务重复调度。
- 任务队列管理: 将待执行任务写入Redis有序集合或消息队列,实现削峰填谷。
- 故障转移: 当执行器宕机时,调度器将任务重新分配给其他健康节点。
2.2.2 执行器 (Executor)
执行器是任务的“手脚”,部署在Worker节点上,负责实际运行任务脚本或命令。其设计要点如下:
- Worker池模型: 每个执行器维护一个goroutine池,控制并发任务数,防止资源耗尽。
- 心跳与健康检查: 每隔5秒向etcd上报心跳,调度器据此判断执行器存活状态。
- 任务执行沙箱: 支持超时控制、内存限制、日志实时回传,避免“坏任务”影响其他任务。
- 结果回调: 任务完成后,通过HTTP或gRPC将执行结果(状态码、输出、耗时)回传调度器。
2.2.3 存储层
存储层采用混合存储策略,不同数据使用最合适的存储引擎:
| 存储组件 | 存储内容 | 选型理由 |
|---|---|---|
| MySQL | 任务定义、执行历史、用户权限、审计日志 | 强ACID事务,支持复杂查询与报表 |
| Redis | 任务队列、分布式锁、热点缓存、计数器 | 高吞吐、低延迟,支持原子操作 |
| etcd | 服务注册与发现、配置中心、Leader选举 | 强一致性、Watch机制、高可用 |
| 对象存储 (MinIO/S3) | 任务日志、执行产物、大文件 | 高扩展、低成本、支持流式读写 |
2.3 API网关与OpenAPI设计
API网关作为系统的统一入口,承担着流量管理、安全防护和协议转换的重任。OpenAPI则定义了外部系统与平台交互的标准契约。
2.3.1 API网关职责
- 统一入口: 所有外部请求(Web控制台、CI/CD系统、第三方工具)都通过网关转发。
- 限流与熔断: 基于令牌桶算法对每个API Key进行限流,防止恶意调用或突发流量压垮后端。
- 认证与鉴权: 支持JWT、OAuth2.0,网关层完成Token校验,后端服务无需重复鉴权。
- 协议转换: 将外部RESTful请求转换为内部gRPC调用,降低后端服务复杂度。
2.3.2 OpenAPI接口设计原则
OpenAPI遵循RESTful风格,以资源为中心,使用标准的HTTP状态码和错误格式。核心接口分类如下:
2.3.3 接口示例:创建任务
以下是一个典型的创建任务请求与响应示例,展示了OpenAPI的契约格式:
// 请求:POST /api/v1/tasks
// Content-Type: application/json
{
"name": "每日数据清洗",
"type": "shell",
"cron": "0 0 2 * * ?",
"timeout": 3600,
"executor_tag": "worker-group-a",
"params": {
"script": "/opt/scripts/cleanup.sh",
"args": ["--date", "{{.Date}}"]
},
"notify": {
"on_failure": ["email", "webhook"],
"webhook_url": "https://alert.example.com/hook"
}
}
// 响应:201 Created
{
"code": 0,
"message": "success",
"data": {
"task_id": "tsk_20250321_001",
"status": "enabled",
"created_at": "2025-03-21T14:30:00+08:00"
}
}
压测关注点: 创建任务接口涉及MySQL写入与Redis缓存更新,是典型的写密集型场景。压测时需重点关注数据库连接池耗尽、Redis写入延迟以及网关限流效果。
2.4 本章小结
本章从宏观到微观,梳理了Go任务调度平台的架构全貌:
- 整体架构: 四层分离(接入层、调度控制层、执行层、存储层),各层通过etcd与gRPC协同。
- 核心组件: 调度器负责决策与分发,执行器负责实际运行,存储层采用混合存储策略。
- API设计: 网关统一管控,OpenAPI遵循RESTful规范,覆盖任务管理、执行控制、日志监控等核心场景。