在Apache DolphinScheduler项目当中,Master service需要从数据库中读取Command进行后续操作。因此本文将重点探讨两种场景下 Command 的创建机制:
- 定时调度主流程中如何创建 Command;
- 故障转移(容错处理)时如何创建 Command。
通过对这两种场景的分析,我们可以更深入地理解 DolphinScheduler 如何在任务调度和异常处理时实现命令驱动,从而确保整个系统的稳定运行。
一、定时调度主流程中的 Command 创建
在分布式任务调度系统 DolphinScheduler 中,定时调度任务的执行依赖 Quartz 框架,具体流程如下:
- 启动 Quartz 的 Scheduler 线程
当 Master 服务启动时,会同步启动 Quartz 的 Scheduler 线程,为后续的任务调度提供基础。 - 提交调度任务到 Quartz
在用户上线定时调度时,系统会将带有定时调度配置的流程定义提交给 Quartz 调度框架,通过调用 API Service 的insertOrUpdateScheduleTask方法完成。 - Quartz 调度执行
当 Quartz 定时器到达预设的时间后,会触发对应的 Job 执行。在 DolphinScheduler 中,Quartz 框架会调用ProcessScheduleTask类的execute方法,并最终调用其executeInternal方法。 - Command 的生成
在executeInternal方法中,系统根据调度策略生成对应的 Command。Command 记录了调度信息、流程定义参数等,并被写入数据库的 Command 表中,为后续执行做好准备。
具体流程如下图所示:
二、故障转移场景下的 Command 生成
在分布式环境中,当 Master 服务意外停止时,DolphinScheduler 提供了容错处理机制,以保障正在运行的流程实例能够被妥善转移和继续执行。其流程如下:
- Master 服务挂掉
调度任务运行期间,若 Master 服务意外停止,则系统会进入故障转移(Failover)流程。 - 故障转移执行
当 Master 服务重新启动或其他 Master 服务检测到故障时,会执行故障转移操作。此时,系统会通过遍历数据库中受影响的流程实例,寻找需要转移的实例。 - Command 的生成
系统通过调用processNeedFailoverProcessInstances函数为每个可转移的流程实例创建一个 Command,Command 类型被设置为RECOVER_TOLERANCE_FAULT_PROCESS,并写入数据库中供 Master 处理。
具体流程如下图所示:
问:此外还有一种特殊情况为,在服务down后,quartz也会关闭。后续master服务重启时,已经过期的定时任务怎么办?
答:对于已经过期的定时任务(即任务的调度时间已经过去),Quartz 会检查任务配置的策略: 默认行为是Quartz 会立即触发过期任务,DolphinScheduler也使用此默认策略。因此无需担心服务down后,已过期的定时任务不会触发执行。