Jiascheduler 2.0:基于Rust的任务调度实现 —— 从批量执行到工作流引擎的进化
一、引言
在现代运维和 DevOps 体系中,任务调度始终是不可或缺的一环。无论是批量执行服务器脚本、定时采集监控数据、还是编排复杂的 CI/CD 流水线,一个稳定、高性能、可扩展的调度系统都是基础底座。
Jiascheduler 正是这样一款用 Rust 编写、面向大规模分布式场景的开源任务调度器。它不仅能将用户脚本同时推送到数万实例运行并实时回收结果,更在最新的 2.0.0 版本中引入了革命性的 Workflow 工作流引擎,实现了从单一任务调度到复杂流程编排的能力跃迁。
GitHub: https://github.com/jiawesoft/jiascheduler
在线体验: https://jiascheduler.iwannay.cn(访客账号: guest / 密码: guest)
二、核心能力全景
2.1 总体架构
Jiascheduler 采用经典的 Console → Comet → Agent 三层分布式架构:
- Console:提供 Web 管理界面和 REST API,负责作业管理、调度编排、结果展示
- Comet:基于 WebSocket 的统一接入网关,负责 Agent 长连接管理和消息路由
- Agent:部署在每台执行节点上,负责接收任务并执行、回传结果
2.2 亮点功能一览
| 功能模块 | 能力描述 |
|---|---|
| 🎯 任务调度 | 支持单次/定时/Cron/守护进程四种调度模式,可指定节点/IP/标签/命名空间精准投放 |
| 🔧 多执行器 | 支持自定义执行器(Shell/Python/任意命令),支持脚本从标准输入注入 |
| 📦 Bundle Script | 在一个作业中编排多步骤脚本,按照条件表达式顺序执行并校验结果 |
| 🔄 Workflow 工作流 | 基于 BPMN 规范的 DAG 流程编排引擎,支持条件网关、Join 汇聚等高级控制 |
| 💻 WebSSH | 内建 Web SSH 终端,支持多会话、分屏操作、SFTP 文件上传下载 |
| 🔐 权限体系 | 团队/标签/RBAC 多维度的权限隔离,Casbin 策略引擎驱动 |
| 📊 执行看板 | Dashboard 实时统计成功率、失败率等关键指标 |
| 🌐 网络穿透 | 创新的跨子网通信模型,Agent 无需与控制台在同一网络 |
| 📡 回调通知 | 任务完成后支持 HTTP 回调,可自定义 Header 及触发条件 |
| 🛡️ 进程守护 | Daemon 模式下支持进程异常退出自动重启(Supervisor 模式) |
三、目标使用群体
3.1 DevOps / SRE 工程师
需要在数十、数百甚至数千台服务器上批量执行运维脚本,或者定时执行巡检任务。Jiascheduler 的一键多节点推送 + 实时结果回收能极大提升效率。
3.2 平台工程团队
需要为内部用户提供一个自助化的任务执行平台。Jiascheduler 提供了完善的 Web 管理界面、RBAC 权限、团队隔离、标签分类等能力,开箱即用。
3.3 数据工程师
需要通过定时调度在多个节点上运行数据采集、ETL 作业。Cron 表达式支持秒级精度,执行历史可追溯、可搜索。
3.4 CI/CD / 流程自动化团队
2.0 版本新增的 Workflow 工作流引擎让 Jiascheduler 具备了编排复杂流水线的能力——编译、测试、部署可以在不同节点上串行/并行执行,并通过条件网关控制流程走向。
3.5 混合云/多云管理场景
得益于网络穿透模型,一个控制台可以管理跨云、跨子网的节点,阿里云 + 腾讯云 + AWS + 本地机房可以统一管理。
四、2.0.0 重磅更新:Workflow 工作流引擎
这是 Jiascheduler 从「任务调度器」迈向「流程编排平台」的关键一步。Workflow 引擎支持基于 BPMN 规范的**有向无环图(DAG)**流程编排。
4.1 节点类型
| 节点类型 | BPMN 标识 | 功能 |
|---|---|---|
| 开始事件 | bpmn:startEvent | 流程的入口,每个 Workflow 必须有且仅有一个开始节点 |
| 服务任务 | bpmn:serviceTask | 实际执行作业的节点,支持 标准作业(引用已有 Job)和 自定义作业(内联脚本)两种模式 |
| 排他网关 | bpmn:exclusiveGateway | 条件分支节点,根据前序节点的执行结果(退出码/输出)决定走哪条分支路径 |
| 结束事件 | bpmn:endEvent | 流程的终点,标记整个 Process 结束 |
4.2 路由与条件表达式
排他网关支持强大的条件路由能力。每条分支边(Edge)可配置规则组,支持以下比较类型:
// 条件值类型
ConditionValType::UserVariables // 流程参数(用户变量)
ConditionValType::Custom // 自定义常量
ConditionValType::ExitCode // 前序节点退出码
ConditionValType::Output // 前序节点输出内容
示例:你可以配置一条规则:「如果节点 A 的退出码 > 0 并且输出内容包含 “ERROR”,则走告警通知分支;否则走正常继续分支」。
条件表达式引擎支持 > / < / >= / <= / == / != / contains 等操作符,多个规则之间使用逻辑表达式组合(&& / ||),并自动处理数值与字符串的类型比较。
4.3 Join 汇聚机制
Workflow 支持 Join All 属性——当一个节点有多条入边时,可以配置为「等待所有前置节点完成后再执行」,确保数据依赖的正确性。引擎通过记录到达的边数来判断是否满足执行条件。
4.4 流程版本管理与快照
每次发布 Workflow 都会生成一个新的版本快照(workflow_version),流程执行时绑定到具体版本。这意味着:
- 发布不受执行中流程影响:编辑 Workflow 后发布新版本,正在运行的 Process 仍使用旧版本继续执行
- 版本回滚:可查看历史版本、对比差异
- 流程可追溯:每个 Process 记录了使用的版本 ID、原始节点和边的完整快照
4.5 流程定时触发
Workflow 支持绑定定时器(workflow_timer),支持标准 Cron 表达式和自然语言描述,秒级精度。每条定时器可以:
- 绑定到特定 Workflow 版本
- 携带自定义的流程参数
- 独立启停,不影响其他定时器
- 记录下次执行时间、上次执行时间、启动错误信息
4.6 Process 运行时状态
一个 Workflow 的每次执行称为一个 Process,引擎完整追踪:
Process → Node (多节点实例) → Task (每节点在每个 Agent 上的执行结果)
每个节点包含:
process_id/run_id/node_id:三级唯一标识node_status:Prepare → Running → Endnode_args:实际执行时的参数快照depth:节点在 DAG 中的层级深度
每个 Task 包含:
- 绑定到的 Agent IP
- 执行结果(退出码、退出状态、输出)
- 调度结果(成功/失败原因)
4.7 架构设计与消息流转
Workflow 引擎采用 Redis Stream 作为消息总线:
发布版本/定时器触发 → 创建 Process →
开始节点 → [Redis Stream "jiascheduler:workflow"] →
服务任务节点 → 并发推送到多个 Agent执行 →
Agent回传结果 → 更新节点状态 →
判断下一节点 → 如果是网关则计算条件 →
继续流转 ... → 结束节点
这种方式天然解耦、支持水平扩展、消息不丢失。
五、作业参数体系:从静态配置到动态表达式
Jiascheduler 的作业参数设计非常灵活,支持形式参数和实际参数的分离:
5.1 参数类型
pub struct WorkflowJobArgs {
pub name: String, // 参数名,对应脚本中的 $变量
pub val: String, // 参数值
pub val_type: String, // 参数类型
pub info: Option<String>, // 参数说明
}
参数值类型支持:
| 类型 | 说明 | 示例 |
|---|---|---|
static | 静态值,直接传递 | "hello world" |
dynamic | 动态引用,引用前序节点的输出/退出码 | 引用节点 A 的输出作为当前节点的参数 |
| 用户变量 | 在启动流程时传入 | {name: "env", val: "production"} |
5.2 脚本模板渲染
作业支持 Handlebars 模板引擎,脚本代码中可以嵌入参数占位符:
#!/bin/bash
echo "当前环境: {{env}}"
echo "目标路径: {{path}}"
# ... 业务逻辑 ...
在调度时会自动将实际的参数值替换进脚本,生成最终的可执行代码发送到 Agent。
5.3 多级目标指定
每个作业的执行目标支持三层优先级:
- 节点级目标(最高优先级):在启动流程时为特定节点指定目标实例
- 任务配置目标:作业/Workflow 节点配置中设定的目标
- 流程默认目标:流程级别的兜底目标
这种设计允许灵活的批量执行与精准的单节点调试。
六、调度体系深度解析
6.1 四种调度模式
| 模式 | ScheduleType | 描述 | 典型场景 |
|---|---|---|---|
| 单次 | Once | 立即或指定时间执行一次 | 临时运维任务 |
| 定时 | Timer | Cron 表达式周期性执行 | 定期巡检、日志清理 |
| 流程 | Flow | Workflow 内部触发,由引擎管理 | 工作流节点自动调度 |
| 守护 | Daemon | 进程常驻,异常退出自动重启 | 后台服务监控 |
6.2 调度生命周期
创建Schedule → dispatch数据到Agent →
Agent执行 → [心跳上报] → 更新运行状态 →
完成后回调 → 写入执行历史
关键数据模型:
job_schedule:调度记录,保存快照数据、实际参数、目标实例、定时表达式等job_running_status:运行中状态,实时跟踪每个实例上的执行状态job_exec_history:执行历史,完整记录每次执行的输出、退出码、时间线
6.3 Bundle Script 条件检查
对于 bundle 类型的作业,每个脚本都可以配置一个条件表达式,在执行后检查结果是否通过:
// 示例:检查脚本输出是否包含 "SUCCESS"
cond_expr = "包含 'SUCCESS'"
所有 Bundle 脚本的结果(退出码、stdout、stderr)统一汇总,形成结构化报表。
6.4 完成回调机制
每次任务完成后可触发 HTTP 回调:
CompletedCallbackOpts {
trigger_on: All | Error, // 全部完成 / 仅失败时
url: "https://your-api.com/callback",
header: {"Authorization": "Bearer xxx"},
enable: true,
}
6.5 进程守护(Supervisor)
守护模式 (Daemon) 支持 Supervisor 子模式,当 Agent 上的进程非正常退出时,控制台会自动下发重启指令,确保服务持续运行。
七、技术亮点总结
- Rust 编写、性能卓越:内存安全、零成本抽象,单节点即可支撑海量 Agent 连接
- Redis Stream 驱动异步消息:Workflow 流转、心跳、事件通知全部通过 Stream 解耦
- SeaORM + MySQL:类型安全的数据访问层,支持复杂联表查询和分页
- Casbin RBAC:灵活的权限模型,支持角色、用户、资源三级管控
- Poem Web 框架 + OpenAPI:自动生成 API 文档
- WebSocket 全双工通信:Agent-Comet 之间保持长连接,支持实时消息推送
- Tokio 异步运行时:全链路异步,充分释放系统资源
- Docker / Docker Compose 一键部署:3分钟完成从零到可用
八、快速上手
# 下载
# https://github.com/jiawesoft/jiascheduler/releases
# 单节点快速启动
./jiascheduler --console-bind-addr 0.0.0.0:9090
# 浏览器访问 localhost:9090,完成初始化安装即可使用
# 部署 Agent 并接入
./jiascheduler-agent \
--comet-addr ws://your-console:3000 \
--namespace production \
--ssh-user root --ssh-port 22 --ssh-password your_pwd
九、结语
Jiascheduler 2.0 的发布标志着这个项目从优秀的任务调度器,进化为具备工作流编排能力的分布式调度平台。无论是批量运维、定时巡检、还是复杂的多步骤流水线,Jiascheduler 都能以 Rust 级的高性能和可靠性为你保驾护航。
开源社区持续活跃,欢迎 Star ⭐、Issue、PR!
GitHub: [https://github.com/jiawesoft/jiascheduler
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)