一、引言

在现代运维和 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 UI + API

Comet 连接层
WebSocket 网关

Agent 节点1
阿里云

Agent 节点2
腾讯云

Agent 节点3
AWS

Agent 节点N
本地机房

MySQL

Redis

  • 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 → End
  • node_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 多级目标指定

每个作业的执行目标支持三层优先级:

  1. 节点级目标(最高优先级):在启动流程时为特定节点指定目标实例
  2. 任务配置目标:作业/Workflow 节点配置中设定的目标
  3. 流程默认目标:流程级别的兜底目标

这种设计允许灵活的批量执行与精准的单节点调试。


六、调度体系深度解析

6.1 四种调度模式

模式ScheduleType描述典型场景
单次Once立即或指定时间执行一次临时运维任务
定时TimerCron 表达式周期性执行定期巡检、日志清理
流程FlowWorkflow 内部触发,由引擎管理工作流节点自动调度
守护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 上的进程非正常退出时,控制台会自动下发重启指令,确保服务持续运行。


七、技术亮点总结

  1. Rust 编写、性能卓越:内存安全、零成本抽象,单节点即可支撑海量 Agent 连接
  2. Redis Stream 驱动异步消息:Workflow 流转、心跳、事件通知全部通过 Stream 解耦
  3. SeaORM + MySQL:类型安全的数据访问层,支持复杂联表查询和分页
  4. Casbin RBAC:灵活的权限模型,支持角色、用户、资源三级管控
  5. Poem Web 框架 + OpenAPI:自动生成 API 文档
  6. WebSocket 全双工通信:Agent-Comet 之间保持长连接,支持实时消息推送
  7. Tokio 异步运行时:全链路异步,充分释放系统资源
  8. 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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐