一、引言
在现代运维和 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),流程执行时绑定到具体版本。这意味着:
4.5 流程定时触发
Workflow 支持绑定定时器(workflow_timer),支持标准 Cron 表达式和自然语言描述,秒级精度。每条定时器可以:
-
绑定到特定 Workflow 版本
-
携带自定义的流程参数
-
独立启停,不影响其他定时器
-
记录下次执行时间、上次执行时间、启动错误信息
4.6 Process 运行时状态
一个 Workflow 的每次执行称为一个 Process,引擎完整追踪:
Process → Node (多节点实例) → Task (每节点在每个 Agent 上的执行结果)
每个节点包含:
每个 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/bashecho "当前环境: {{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