# decentralized-task-scheduler **Repository Path**: jonnyjiang/decentralized-task-scheduler ## Basic Information - **Project Name**: decentralized-task-scheduler - **Description**: 高性能、可扩展、去中心化的任务调度系统 - **Primary Language**: TypeScript - **License**: Apache-2.0 - **Default Branch**: refactor-go - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 2 - **Created**: 2025-11-01 - **Last Updated**: 2026-04-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 🚀 高性能分布式任务调度系统 > **Go 1.21+** | **单机百万级任务** | **分布式集群** | **服务端渲染** 一个基于 Go 的高性能分布式任务调度系统,支持单机/集群双模式部署,已实现单机百万级任务 100% 完成率调度和集群 9000+ 任务并发调度。 --- ## ✨ 核心特性 ### 🎯 极限性能优化 - **4级时间轮算法**:4096槽位 × 50ms精度,O(1) 时间复杂度调度 - **对象池复用**:sync.Pool 优化 Task/Execution 对象分配,减少 GC 压力 - **工作池模式**:可配置 Worker 数量,支持背压控制 - **跳表索引**:O(log n) 任务查询性能,替代线性扫描 - **批量异步写入**:执行记录 1000 条/批,减少数据库 I/O - **WAL 预写日志**:执行记录零丢失,优雅关闭保证数据完整性 - **高性能连接池**:SQLite WAL 模式 + 200 并发连接 ### 🌐 分布式集群支持 - **Raft 共识协议**:Leader 选举、日志复制、一致性保证 - **16384 哈希槽**:类似 Redis Cluster 的任务分片机制 - **去中心化架构**:无单点故障,支持水平扩展 - **集群监控**:实时显示各节点 CPU、内存、任务数、Raft 状态 - **故障自动恢复**:Leader 故障自动重选,集群高可用 ### 📊 单机性能测试结果(2025-11-02) | 任务规模 | 完成率 | 峰值吞吐 | 创建速度 | Worker数 | |---------|--------|---------|---------|---------| | 1K 任务 | **100.0%** | 500 tasks/s | 962K tasks/s | 100 | | 10K 任务 | **100.0%** | 996 tasks/s | 1.04M tasks/s | 500 | | 100K 任务 | **100.0%** | 2,006 tasks/s | 957K tasks/s | 1000 | | **1M 任务** | **100.0%** | **32,496 tasks/s** | 989K tasks/s | 2000 | **关键指标:** - ✅ 百万级任务 100% 完成率(无遗漏、无重复) - ✅ 峰值吞吐达 32,496 tasks/s - ✅ CPU 核心数:12 核,GOMAXPROCS=120(10× I/O 密集型优化) - ✅ 任务创建速度稳定在 900K+ tasks/s ### 📊 集群性能测试结果(2025-11-02) **3节点 Raft 集群压力测试:** | 任务数 | 创建成功 | 集群健康 | 平均CPU | 总内存 | 备注 | |--------|----------|----------|---------|--------|------| | 1,000 | 1,000 | ✅ 是 | 6.41% | 45.86 MB | 稳定 | | 3,000 | 3,000 | ✅ 是 | 5.56% | 47.13 MB | 稳定 | | 5,000 | 5,000 | ✅ 是 | 2.78% | 47.06 MB | 稳定 | | 7,000 | 7,000 | ✅ 是 | 16.67% | 47.35 MB | 稳定 | | **9,000** | **9,000** | ✅ **是** | **1.39%** | **47.61 MB** | **稳定** | **关键指标:** - ✅ 3节点集群可支持 **9,000+** 并发定时任务 - ✅ CPU 使用率保持极低(< 20%) - ✅ 内存占用稳定(< 50 MB) - ✅ 集群全程保持健康状态 - ✅ 理论最大值:**50,000+** 任务(需进一步测试验证) > 📖 详细测试报告:[docs/CLUSTER_MAX_TASKS_TEST.md](./docs/CLUSTER_MAX_TASKS_TEST.md) ### 🛠 功能特性 - **双部署模式**:单机模式(零配置)+ 集群模式(Raft) - **多任务类型**:一次性(once)、延迟执行(delayed)、周期执行(periodic)、Cron 表达式 - **智能 URL 处理**:自动补全 http/https 协议(支持 `www.baidu.com` → `https://www.baidu.com`) - **执行记录追踪**:完整的任务执行历史和统计 - **超时控制**:可配置任务执行超时时间 - **失败重试**:支持自动重试机制 - **实时监控**:系统资源和任务执行指标监控 - **集群监控**:各节点 CPU、内存、Goroutine、任务统计、趋势图表 - **服务端渲染**:Go HTML 模板 + Vue 3 CDN + Element Plus CDN --- ## 📁 项目结构 ``` . ├── cmd/ │ ├── scheduler/ # 主程序入口 │ └── benchmark/ # 性能测试入口 ├── internal/ │ ├── api/ # HTTP API 层 │ │ ├── handler/ # 请求处理器(任务、执行、集群) │ │ ├── middleware/ # 中间件 │ │ └── router.go # 路由配置 │ ├── cluster/ # 集群管理 │ │ ├── manager.go # 集群管理器 │ │ ├── raft/ # Raft 协议实现 │ │ └── hashslot/ # 哈希槽管理(16384槽) │ ├── config/ # 配置管理 │ ├── model/ # 数据模型 │ ├── repository/ # 数据持久化层 │ │ ├── sqlite_task_repository.go │ │ ├── sqlite_execution_repository.go │ │ ├── reliable_writer.go # WAL 可靠写入 │ │ └── task_status_cache.go # 状态缓存 │ ├── scheduler/ # 核心调度器 │ │ ├── scheduler.go # 调度器主逻辑 │ │ ├── time_wheel.go # 4级时间轮实现 │ │ ├── task_loader.go # 任务加载器 │ │ └── executor.go # 任务执行器 │ └── service/ # 业务逻辑层 ├── pkg/ │ ├── logger/ # 日志工具 │ ├── snowflake/ # 分布式ID生成器 │ └── utils/ # 通用工具 ├── templates/ # HTML 模板(服务端渲染) │ ├── tasks.html # 任务管理页面 │ ├── executions.html # 执行记录页面 │ ├── metrics.html # 系统监控页面 │ └── cluster.html # 集群监控页面 ⭐新增 ├── static/ # 静态资源 ├── benchmark/ # 性能测试 │ ├── test_1k.go # 1K 任务测试 │ ├── test_10k.go # 10K 任务测试 │ └── million_benchmark.go # 百万级测试 ├── test/ # 测试脚本 │ ├── cluster_max_tasks_test.ps1 # 集群压力测试 ⭐新增 │ └── cluster_capacity_test.ps1 ├── scripts/ # 部署脚本 │ ├── start-cluster.ps1 # 集群启动脚本 ⭐新增 │ └── start-cluster.sh ├── docs/ # 文档 │ ├── CLUSTER_MAX_TASKS_TEST.md # 集群测试报告 ⭐新增 │ ├── CLUSTER_IMPLEMENTATION.md # 集群实现文档 │ └── architecture.md ├── data/ # 数据文件目录 ├── cluster.config.json # 集群配置 ⭐新增 ├── config.yaml # 单机配置 ├── Makefile # 构建脚本 ├── start.bat # Windows 一键启动 └── start.sh # Linux/Mac 一键启动 ``` --- ## 🚀 快速开始 ### 前置要求 - **Go 1.21+** (推荐 1.25.3) ### 模式1: 单机模式(推荐新手) **一键启动:** ```bash # Windows start.bat # Linux/Mac chmod +x start.sh ./start.sh # Makefile make start ``` 启动脚本会自动: 1. 编译 Go 程序(`go build -o ./bin/scheduler.exe ./cmd/scheduler`) 2. 启动调度器服务(端口:3000) **访问系统:** - **任务管理**: http://localhost:3000/tasks - **执行记录**: http://localhost:3000/executions - **系统监控**: http://localhost:3000/metrics - **健康检查**: http://localhost:3000/api/health ### 模式2: 集群模式(生产推荐) **方式1: 使用启动脚本(推荐)** ```bash # Windows ./scripts/start-cluster.ps1 # Linux/Mac chmod +x ./scripts/start-cluster.sh ./scripts/start-cluster.sh ``` 脚本会自动启动3个节点: - **节点1**: http://localhost:8081 (通常为 Leader) - **节点2**: http://localhost:8082 (Follower) - **节点3**: http://localhost:8083 (Follower) **方式2: 手动启动** ```bash # 先编译 go build -o bin/scheduler.exe ./cmd/scheduler # 节点1 $env:NODE_ID='node-1'; $env:HTTP_PORT='8081'; $env:CLUSTER_MODE='true'; $env:DATA_DIR='data/cluster/node-1'; ./bin/scheduler.exe # 节点2 $env:NODE_ID='node-2'; $env:HTTP_PORT='8082'; $env:CLUSTER_MODE='true'; $env:DATA_DIR='data/cluster/node-2'; ./bin/scheduler.exe # 节点3 $env:NODE_ID='node-3'; $env:HTTP_PORT='8083'; $env:CLUSTER_MODE='true'; $env:DATA_DIR='data/cluster/node-3'; ./bin/scheduler.exe ``` **访问集群监控:** - **集群监控页面**: http://localhost:8081/cluster ⭐新增 - **Raft 状态**: http://localhost:8081/raft/status - **集群指标 API**: http://localhost:8081/api/cluster/metrics ### 集群配置文件 `cluster.config.json` 示例: ```json { "nodes": [ { "id": "node-1", "host": "127.0.0.1", "port": 8081, "raftPort": 8091 }, { "id": "node-2", "host": "127.0.0.1", "port": 8082, "raftPort": 8092 }, { "id": "node-3", "host": "127.0.0.1", "port": 8083, "raftPort": 8093 } ], "raft": { "electionTimeout": 1000, "heartbeatInterval": 100, "logRetention": 10000 } } ``` --- ## 📊 系统界面 系统提供了直观的 Web 管理界面,基于 Vue 3 + Element Plus 构建: ### 1. 任务管理页面 (`/tasks`) - 任务列表展示(名称、类型、状态、下次执行时间) - 新建任务(支持一次性、Cron、间隔类型) - 任务操作(暂停、恢复、删除、立即执行) - 实时搜索过滤 ### 2. 执行记录页面 (`/executions`) - 执行历史记录 - 状态统计(成功/失败/超时) - 执行耗时分析 - 错误信息展示 ### 3. 系统监控页面 (`/metrics`) - CPU/内存使用率 - 任务执行统计 - Goroutine 数量 - 系统运行时长 ### 4. 集群监控页面 (`/cluster`) ⭐新增 - **集群概览**:健康状态、Leader 节点、节点数、总任务数 - **节点详情**:每个节点的 CPU、内存、Goroutine、任务统计 - **实时趋势图**:CPU 使用率、内存使用、任务执行趋势(Chart.js) - **自动刷新**:3秒自动刷新,可开关 - **Leader 标识**:Leader 节点高亮显示 > 📸 页面截图待补充 --- ## ⚙️ 配置说明 ### 单机模式配置 (`config.yaml`) ```yaml server: host: "0.0.0.0" port: 3000 readTimeout: 30s writeTimeout: 30s scheduler: workerID: "" # Worker ID(自动生成) maxConcurrentTasks: 2000 # 最大并发任务数 scanInterval: 10ms # 任务扫描间隔 heartbeatInterval: 5s # 心跳间隔 taskLoadWindow: 3600s # 任务加载时间窗口(1小时) taskLoadInterval: 2s # 任务加载间隔 timeWheelSlots: 4096 # 时间轮槽位数(建议 2^n) timeWheelTickInterval: 50ms # 时间轮精度 database: driver: "sqlite" dsn: "./data/scheduler.db" maxOpenConns: 200 maxIdleConns: 100 connMaxLifetime: 3600s log: level: "info" # debug, info, warn, error encoding: "json" outputPaths: ["stdout"] ``` ### 集群模式配置 (`cluster.config.json`) ```json { "nodes": [ {"id": "node-1", "host": "127.0.0.1", "port": 8081, "raftPort": 8091}, {"id": "node-2", "host": "127.0.0.1", "port": 8082, "raftPort": 8092}, {"id": "node-3", "host": "127.0.0.1", "port": 8083, "raftPort": 8093} ], "raft": { "electionTimeout": 1000, # Leader 选举超时(ms) "heartbeatInterval": 100, # 心跳间隔(ms) "logRetention": 10000 # 日志保留条数 }, "hashSlots": 16384 # 哈希槽数量(类似 Redis Cluster) } ``` **性能调优建议:** - `maxConcurrentTasks`: 1K任务→100, 10K任务→500, 1M任务→2000 - `timeWheelSlots`: 建议 2的幂(2048, 4096, 8192) - `timeWheelTickInterval`: 50ms适合大多数场景 - `GOMAXPROCS`: I/O密集型建议为CPU核心数 × 10 --- ## 📖 API 文档 ### 任务管理 API **创建任务:** ```bash curl -X POST http://localhost:3000/api/tasks \ -H "Content-Type: application/json" \ -d '{ "name": "示例任务", "cron_expr": "0 * * * *", "command": "curl https://api.example.com/webhook", "timeout": 30, "max_retries": 3, "description": "每小时执行一次" }' ``` **其他接口:** - `GET /api/tasks` - 获取任务列表 - `GET /api/tasks/:id` - 获取任务详情 - `PUT /api/tasks/:id` - 更新任务 - `DELETE /api/tasks/:id` - 删除任务 - `POST /api/tasks/:id/pause` - 暂停任务 - `POST /api/tasks/:id/resume` - 恢复任务 ### 集群管理 API ⭐新增 **获取集群指标:** ```bash curl http://localhost:8081/api/cluster/metrics ``` 响应示例: ```json { "cluster_healthy": true, "leader": "node-1", "total_nodes": 3, "healthy_nodes": 3, "nodes": [ { "node_id": "node-1", "state": "leader", "is_leader": true, "term": 1, "cpu_percent": 6.41, "memory_used_mb": 45.86, "memory_percent": 0.13, "goroutine_count": 18, "running_tasks": 0, "waiting_tasks": 0, "total_tasks_in_wheel": 0 } // ... 其他节点 ], "total_running_tasks": 0, "total_waiting_tasks": 0, "total_memory_mb": 137.58, "avg_cpu_percent": 6.41 } ``` **获取 Raft 状态:** ```bash curl http://localhost:8081/raft/status ``` > 📖 完整 API 文档:[docs/API.md](./docs/API.md) --- ## 🧪 性能测试 ### 单机性能测试 ```bash # 1K 任务测试(基础性能) go run ./benchmark/test_1k.go # 10K 任务测试(中等规模) go run ./benchmark/test_10k.go # 100万任务测试(极限性能) go run ./benchmark/million_benchmark.go ``` ### 集群压力测试 ⭐新增 ```bash # 快速测试(1000-10000,步进2000) ./test/cluster_max_tasks_test.ps1 # 自定义范围 ./test/cluster_max_tasks_test.ps1 -StartTasks 5000 -MaxTasks 50000 -StepSize 5000 ``` 测试脚本会: 1. 逐步增加任务数量 2. 监控集群各节点 CPU、内存 3. 记录任务创建成功率 4. 检查集群健康状态 5. 自动清理测试数据 6. 输出详细测试报告 ### 性能优化历程 本项目经过系统性能调优,修复了 4 个关键 Bug,完成率从 22.95% 提升至 **100%**: **修复前(Bug 导致严重遗漏):** | 任务规模 | 完成率 | 峰值吞吐 | |---------|--------|---------| | 1M 任务 | 22.95% | 1,273 tasks/s | **修复后(100% 完成率):** | 任务规模 | 完成率 | 峰值吞吐 | 提升幅度 | |---------|--------|---------|---------| | 1M 任务 | **100.0%** | **32,496 tasks/s** | ✅ +77.05% 完成率 | **关键修复:** 1. 时间轮 tick 间隔修复(1s → 50ms) 2. 时间轮槽位遍历顺序修复 3. 任务加载器重试循环修复 4. 一次性任务索引泄漏修复 --- ## 🏗 核心技术原理 ### 1. 服务端渲染架构 **设计思路:** - 摒弃前后端分离复杂性,采用传统服务端渲染 - Go HTML 模板引擎渲染页面框架 - CDN 引入 Vue 3 + Element Plus + Axios - 单端口部署,零前端构建 **优势:** - ✅ 部署简单:一个可执行文件 - ✅ 资源占用低:无需 Node.js - ✅ 启动快速:无前端构建过程 - ✅ 维护方便:单一技术栈 ### 2. 4级时间轮调度算法 **参数配置:** - 槽位数量:4096(可配置,建议 2^n) - 槽位精度:50ms(每秒 tick 20 次) - 时间范围:0-204.8秒(4096 × 50ms) **复杂度:** - 插入任务:O(1) - 删除任务:O(1) - 获取到期任务:O(1) **防重复机制:** - 一次性任务执行完保留索引,防止重复加载 ### 3. XXL-Job 风格任务加载 **设计原则:** 1. **提前加载**:TaskLoader 提前加载未来 1 小时任务到内存 2. **内存调度**:任务在时间轮中调度,减少数据库查询 3. **异步持久化**:状态更新缓存批量写入(1000条/批) 4. **防重复**:loadedTasks 映射跟踪已加载任务 ### 4. Raft 共识协议 ⭐ **核心组件:** - **Leader 选举**:超时选举机制,保证集群唯一 Leader - **日志复制**:Leader 将操作日志复制到 Followers - **状态机**:一致性状态机保证各节点数据一致 - **心跳机制**:Leader 定期心跳维持权威 **状态转换:** ``` Follower → Candidate → Leader ↑ ↓ └────────────────────┘ (选举超时/收到更高term) ``` ### 5. 哈希槽任务分片 ⭐ **设计思路(类似 Redis Cluster):** - **16384 个哈希槽**:任务根据 hash(task_id) % 16384 分配槽位 - **槽位分配**:3节点集群,每节点管理约 5461 个槽位 - **任务路由**:根据任务所属槽位路由到对应节点执行 - **负载均衡**:哈希均匀分布保证各节点负载均衡 **优势:** - 水平扩展容易(重新分配槽位) - 任务分布均匀 - 节点故障槽位重分配快速 ### 6. WAL 预写日志 **可靠性保证:** - 执行记录先写 WAL,再异步刷盘 - 优雅关闭确保所有 WAL 数据刷新 - 程序崩溃也不丢失执行记录 ### 7. 对象池优化 ```go var taskPool = sync.Pool{ New: func() interface{} { return &model.Task{} }, } ``` - 减少高频对象分配 - 降低 GC 压力 - 适用于百万级任务场景 ### 8. 集群监控实现 ⭐新增 **技术栈:** - **后端**:`gopsutil/v3` 采集系统指标(CPU、内存、进程) - **前端**:Chart.js 4.4.0 绘制趋势图表 - **通信**:RESTful API 3秒轮询 **监控指标:** - **系统级**:CPU 使用率、内存占用、Goroutine 数量 - **Raft 级**:节点状态、Term、Leader ID - **调度器级**:运行任务数、等待任务数、时间轮大小 --- ## 🔧 Makefile 命令 ```bash make help # 查看所有命令 make deps # 安装 Go 依赖 make build # 构建应用 make run # 运行单机模式 make start # 一键启动服务 make stop # 停止服务(Windows) make test # 运行测试 make fmt # 格式化代码 make lint # 代码检查 make vet # 静态分析 make clean # 清理构建产物 make clean-all # 深度清理 ``` --- ## 🎯 后期扩展点 ### 短期优化 1. **增加页面截图**:补充各页面使用截图到 README 2. **更大规模测试**:测试 50K、100K 集群任务调度 3. **故障恢复测试**:杀死 Leader 节点验证重选举 4. **日志持久化**:Raft 状态持久化到磁盘 ### 中期扩展 1. **任务依赖关系**:支持 DAG 任务流 2. **动态优先级**:根据负载动态调整任务优先级 3. **Prometheus 集成**:导出监控指标 4. **Redis 缓存**:热数据缓存加速 5. **WebSocket 推送**:实时任务状态推送 ### 长期规划 1. **千万级任务调度**:单机 10M 任务性能优化 2. **多集群联邦**:跨集群任务调度 3. **任务编排**:可视化任务流编排 4. **告警系统**:任务失败、集群异常告警 5. **插件系统**:支持自定义任务执行器 --- ## 📚 文档索引 - **架构设计**: [docs/architecture.md](./docs/architecture.md) - **API 参考**: [docs/API.md](./docs/API.md) - **集群实现**: [docs/CLUSTER_IMPLEMENTATION.md](./docs/CLUSTER_IMPLEMENTATION.md) - **集群测试报告**: [docs/CLUSTER_MAX_TASKS_TEST.md](./docs/CLUSTER_MAX_TASKS_TEST.md) ⭐新增 - **部署指南**: [docs/deployment_guide.md](./docs/deployment_guide.md) - **快速开始**: [docs/QUICK_START.md](./docs/QUICK_START.md) - **性能优化**: [docs/SCHEDULER_OPTIMIZATION.md](./docs/SCHEDULER_OPTIMIZATION.md) - **待办事项**: [TODO.md](./TODO.md) --- ## 📝 更新日志 ### v1.2.0 (2025-11-02) ⭐最新 **集群监控功能:** - ✅ 集群监控仪表板(`/cluster`) * 实时显示集群健康状态、Leader、节点数 * 各节点 CPU、内存、Goroutine、任务统计 * 趋势图表(Chart.js)with 3秒自动刷新 - ✅ 集群指标 API(`/api/cluster/metrics`) * 系统资源监控(gopsutil/v3) * Raft 状态集成 * 调度器统计集成 **集群压力测试:** - ✅ 3节点集群最大并发任务数:9,000+ 任务 - ✅ CPU 使用率:< 20% - ✅ 内存占用:< 50MB - ✅ 集群稳定性:优秀 - ✅ 详细测试报告:`docs/CLUSTER_MAX_TASKS_TEST.md` - ✅ 测试脚本:`test/cluster_max_tasks_test.ps1` **集群部署:** - ✅ 集群启动脚本:`scripts/start-cluster.ps1`、`start-cluster.sh` - ✅ 集群配置文件:`cluster.config.json` ### v1.1.0 (2025-11-02) **架构重构:** - ♻️ 前后端分离 → 服务端渲染(Go Templates + Vue 3 CDN) - ♻️ 移除 Node.js 依赖 - ✅ 单端口部署 **性能优化:** - 🐛 修复时间轮 4 个关键 Bug - ✅ 百万级任务 100% 完成率(22.95% → 100%) - ✅ 峰值吞吐 32,496 tasks/s ### v1.0.0 (2025-11-01) **重大更新:** - ✅ TypeScript → Go 1.21+ 完全重构 - ✅ Raft 集群支持 - ✅ 16384 哈希槽任务分片 - ✅ Vue 3 监控页面 - ✅ Makefile 构建系统 --- ## 🤝 贡献 欢迎提交 Issue 和 Pull Request! ## 📄 许可证 MIT License --- **最后更新**: 2025年11月2日 | **版本**: v1.2.0 | **状态**: ✅ 生产就绪