2. Go任务调度平台架构概览:整体架构图、核心组件与OpenAPI设计

在开始压测之前,必须清晰理解目标系统的架构。本章将拆解基于Go构建的任务调度平台,从整体架构图、核心组件(调度器、执行器、存储层)到API网关与OpenAPI设计,为后续的压测场景设计奠定基础。

2.1 整体架构图

平台采用经典的分层微服务架构,从上至下依次为:接入层、调度控制层、执行层与存储层。各层职责明确,通过轻量级通信协议解耦。

Go任务调度平台整体架构图 接入层 API网关 (Kong / Nginx + Lua) | 限流 | 鉴权 | 路由 OpenAPI (RESTful / gRPC-Gateway) 调度控制层 调度器 (Scheduler) | 任务分发 | 状态管理 | 故障转移 基于etcd的Leader选举 | 分布式锁 | 任务队列 执行层 执行器 (Executor) | 任务Worker池 | 心跳上报 Shell / HTTP / 脚本执行 | 日志采集 | 结果回调 存储层 MySQL (任务定义/历史) | Redis (缓存/队列) | etcd (配置/协调) 对象存储 (日志/产物)
架构要点: 调度器与执行器通过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状态码和错误格式。核心接口分类如下:

OpenAPI 核心接口分类 任务管理 POST /tasks GET /tasks/{id} PUT /tasks/{id} 执行控制 POST /tasks/{id}/run POST /tasks/{id}/kill GET /tasks/{id}/status 日志与监控 GET /tasks/{id}/logs GET /executors GET /metrics 系统管理 POST /users GET /namespaces POST /webhook 配置管理 GET /configs PUT /configs/{key} DELETE /configs/{key}

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规范,覆盖任务管理、执行控制、日志监控等核心场景。