阅读 Argo Workflows 的源码

196 阅读2分钟

阅读 Argo Workflows 的源码并迁移其核心理念到自建的流程引擎项目,可以通过以下 四个阶段 快速掌握架构核心:


🔍 一、掌握 Argo Workflows 的核心架构理念

Argo Workflows 的本质是:基于 Kubernetes CRD 的声明式工作流引擎,其核心理念包括:

核心概念说明
Workflow CRD用 YAML 声明工作流,Argo Controller 监听 CR 创建和状态变更事件。
Template工作流节点的“模板”,支持容器任务、步骤串联(steps)、DAG 等多种结构。
Execution Engine控制器调度各个模板并通过 Kubernetes Pod 执行任务。
参数传递机制通过 inputs/outputs 显式传递参数,实现步骤之间数据传递。
状态管理Workflow 的状态持久化为 CR 状态字段,包括 Running、Succeeded 等。
重试、依赖、并发控制基于 DAG 或 Step 定义依赖关系,可配置重试、资源限制等。

🧭 二、推荐阅读顺序(快速定位源码核心)

以下是理解 Argo Workflows 源码的推荐路径(可配合 IDEA + Delve 调试):

1. Workflow 入口定义:

  • CRD 定义(workflow 的结构)
    路径:pkg/apis/workflow/v1alpha1/workflow_types.go

2. 控制器核心逻辑:

  • 主控制器入口
    路径:cmd/workflow-controller/main.go
  • 控制器初始化与循环监听
    路径:workflow/controller/controller.go
    关键方法:Run(ctx context.Context)
  • Workflow 状态推进核心逻辑
    路径:workflow/controller/operator.go
    关键方法:operate(ctx context.Context, wf *wfv1.Workflow)

3. 节点执行器逻辑:

  • DAG 和 Step 执行
    路径:

    • DAG:workflow/controller/dag.go
    • Steps:workflow/controller/steps.go
  • 参数传递 / 模板渲染
    路径:workflow/common/util.go, template/template.go

4. 工作流状态更新:

  • workflow/controller/workflowpod.go 负责调度 Pod 并跟踪状态

🏗️ 三、迁移核心理念到自建流程引擎

如果你希望实现一个简化版的工作流系统,可以考虑迁移这些关键理念:

Argo 特性自建项目迁移建议
使用 CRD 定义工作流✅可改为用数据库表或 JSON 配置进行替代
模板(Template)机制✅模板可映射为某类“任务节点”或“组件类型”
DAG/Step 控制流✅用有向图或状态机表示各节点之间依赖
参数传递机制✅使用上下文对象或中间数据表传递参数
控制器调度和执行引擎✅实现调度器服务,分发任务并调用容器/函数/子服务
状态持久化✅将任务状态持久化到数据库,支持回查与重试控制

🛠️ 四、推荐工具链与实现建议

如果你不是强依赖 Kubernetes,还可以这样简化 Argo 的思路:

  • 任务执行层:使用容器(Docker)或本地执行器(如 subprocess)

  • 调度与依赖解析:使用 DAG 引擎库,如:

  • 状态跟踪:数据库 + 事件总线(如 Redis Stream, Kafka)

  • 参数传递:使用 contextTaskRun 数据结构


✅ 示例自建架构简图:

lua
CopyEdit
+-------------------+
|  Workflow Manager |  <- 负责解析 DAG, 分配任务
+-------------------+
          |
          v
+-------------------+     +--------------------+
|  Task Executor A  | <-- |  Task Executor B   |
+-------------------+     +--------------------+
          |                       |
       Task Results            Task Results
          |                       |
          v                       v
      +--------+          +---------------+
      | Redis  |          |  Postgres DB  |
      +--------+          +---------------+

image.png

image.png