首页
/ Apache DolphinScheduler 主节点线程池与状态事件编排重构解析

Apache DolphinScheduler 主节点线程池与状态事件编排重构解析

2025-05-17 08:32:27作者:仰钰奇

引言

在现代分布式任务调度系统中,状态管理和并发控制一直是架构设计的核心难点。Apache DolphinScheduler 作为业界广泛使用的分布式工作流任务调度系统,其主节点(Master)的线程模型和状态控制机制近期迎来了重大重构。本文将深入剖析这次重构的技术细节与设计思想。

原有架构的问题

在原有架构中,DolphinScheduler 主节点存在几个关键性问题:

  1. 状态并发修改风险:多个线程池(RPC线程池、故障恢复守护线程、工作流执行线程池等)都能修改工作流实例状态,缺乏原子性保证,容易导致状态不一致。

  2. 任务状态不一致:主节点与工作节点间的任务状态无法保证最终一致性,当出现网络问题或节点故障时,可能出现主节点认为任务已停止但工作节点仍在执行的情况。

  3. 状态机缺失:状态转换依赖大量条件判断,难以维护和扩展,新增状态几乎需要修改整个主节点代码。

  4. 故障恢复缺陷:全局故障恢复检查过于频繁,且未使用分页查询,在压力测试中容易导致内存溢出。

新架构设计

新架构采用了基于事件总线的设计模式,核心思想是将所有可能影响工作流/任务运行的操作转化为生命周期事件,并按事件到达顺序处理,确保状态转换的原子性和一致性。

核心组件

  1. 工作流事件总线(WorkflowEventBus)
    每个工作流实例拥有独立的事件通道,所有操作转化为事件并按序处理,确保单工作流内事件的顺序性。

  2. 事件总线协调器(WorkflowEventBusCoordinator)
    负责管理事件总线并分配工作线程,采用可配置的工作线程数,每个工作线程以DFS方式处理多个事件总线。

  3. 状态机(StateMachine)
    引入工作流状态机(WorkflowStateMachine)和任务状态机(TaskStateMachine),每个状态实现特定接口处理对应事件。

  4. 执行图模型

    • 工作流执行图(WorkflowExecutionGraph):表示运行时实际的DAG结构,包含运行时状态
    • 工作流图(WorkflowGraph):表示原始的DAG定义

事件类型

系统定义了丰富的事件类型来描述工作流和任务的生命周期:

工作流生命周期事件

  • 启动(START)
  • 拓扑逻辑转换(TOPOLOGY_LOGICAL_TRANSACTION)
  • 暂停(PAUSE)/已暂停(PAUSED)
  • 停止(STOP)/已停止(STOPPED)
  • 成功(SUCCEED)
  • 失败(FAILED)
  • 终止(FINALIZE)

任务生命周期事件

  • 启动(START)
  • 分发(DISPATCH)/已分发(DISPATCHED)
  • 运行中(RUNNING)
  • 暂停(PAUSE)/已暂停(PAUSED)
  • 终止(KILL)/已终止(KILLED)
  • 成功(SUCCEEDED)
  • 失败(FAILED)

故障恢复机制

新架构设计了三种故障恢复事件:

  1. 全局主节点故障恢复(GlobalMasterFailover)
    主节点启动时触发,扫描数据库中所有未完成的工作流实例,检查是否需要恢复。

  2. 主节点故障恢复(MasterFailover)
    当主节点崩溃时,其他活跃主节点接收事件并处理崩溃主节点负责的工作流。

  3. 工作节点故障恢复(WorkerFailover)
    当工作节点崩溃时,所有主节点处理已分发给该工作节点但未完成的任务。

技术优势

  1. 状态一致性保障
    通过事件总线和状态机的组合,确保状态修改的原子性和顺序性,消除竞态条件。

  2. 可维护性提升
    状态机模式使状态转换逻辑清晰可见,新增状态只需实现对应接口,无需修改核心逻辑。

  3. 性能优化
    事件总线协调器可配置工作线程数,根据数据库连接池大小优化,避免不必要的线程上下文切换。

  4. 可靠性增强
    故障恢复机制分级处理,避免全表扫描导致的性能问题,确保系统稳定性。

实现细节

状态机实现

每个状态需要实现对应的状态动作接口:

// 工作流状态动作接口
public interface IWorkflowStateAction {
    void startEventAction(...);
    void topologyLogicalTransitionEventAction(...);
    void pauseEventAction(...);
    // 其他事件处理方法
}

// 任务状态动作接口
public interface ITaskStateAction {
    void startEventAction(...);
    void dispatchEventAction(...);
    void pauseEventAction(...);
    // 其他事件处理方法
}

执行图操作

工作流执行图提供丰富的操作方法管理任务状态:

public interface IWorkflowExecutionGraph {
    void addNode(TaskExecutionRunnable task);
    void addEdge(String fromTask, Set<String> toTasks);
    List<ITaskExecutionRunnable> getStartNodes();
    boolean isTriggerConditionMet(ITaskExecutionRunnable task);
    void markTaskExecutionRunnableActive(ITaskExecutionRunnable task);
    void markTaskSkipped(ITaskExecutionRunnable task);
    // 其他操作方法
}

总结

这次重构使Apache DolphinScheduler的主节点架构更加清晰和健壮,通过事件总线和状态机的引入,解决了长期存在的状态管理难题。新设计不仅提高了系统的可靠性和可维护性,还为未来的功能扩展奠定了良好基础。对于开发者而言,理解这一架构变化对于深入使用和二次开发DolphinScheduler具有重要意义。

登录后查看全文
热门项目推荐
相关项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
860
511
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
596
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K