Architecture & Milestone Report

Firefly Workflow Engine

自研工作流引擎架构设计与里程碑汇报

SongJian · 2026

02

一个工作流的完整旅程

本次汇报沿着一条工作流从设计到运行的完整生命周期展开,串联所有核心技术点。

Design
草稿 & 沙箱
Publish
安全发布 & 回滚
Execute
触发 & DAG 调度
Wait
回调 & 超时
Recover
故障自愈
Observe
Metrics & Trace
Extend
SPI 扩展
03

系统定位与核心能力

Firefly Workflow Engine 是一套面向 KYC/KYB 合规场景的可视化工作流引擎,支持从工作流设计、发布、执行到审计的全生命周期管理。

🎨

可视化编排

拖拽式画布设计,节点+连线直观构建工作流

双模执行引擎

同步秒级响应 / 异步长时等待,统一引擎透明切换

🧩

50+ 节点生态

覆盖 KYC、KYB、审核、计算等场景,即插即用扩展

🔄

故障自动恢复

服务重启后自动检测并恢复中断的执行,零丢失

🚀

安全发布 & 回滚

多版本管理,分布式锁保障并发安全,秒级回滚

📊

全链路可观测

实时 Metrics 监控 + 全链路 Trace 回放,满足合规审计

04

架构全景

整体架构分为四层,上层定义"做什么",下层实现"怎么做",通过接口契约解耦。

Studio Layer草稿设计 · 沙箱测试 · 版本发布 · 回滚管理 — 用户与系统的交互入口
Engine LayerDAG 调度 · 上下文管理 · 状态持久化 · 变量解析 — 工作流执行的核心大脑
Extension LayerSPI 节点注册 · 回调管理 · 超时调度 · 容错策略 — 面向接口的扩展机制
InfrastructureRedis(状态) · MySQL(定义) · MongoDB(草稿) · ClickHouse(追踪) · XXL-Job(调度)
Draft Version Execution Trace
05 Design

草稿管理:工作流的设计态

工作流的旅程从草稿开始。开发者在画布上编排节点和连线,定义业务逻辑。草稿是可编辑的"设计态",与生产环境完全隔离。

创建草稿 编辑画布 沙箱测试 反复迭代 发布上线

独立空间

每个草稿拥有独立编辑空间,多人可并行设计不同草稿,互不干扰

版本 Fork

可从已有生产版本 Fork 创建草稿,继承全部节点、连线和容错策略

画布三要素

节点(业务逻辑)、连线(执行顺序)、容错策略(失败时的行为)

06 Design

沙箱测试:发布前的安全验证

草稿编辑完成后,如何在不影响生产的情况下验证业务逻辑?沙箱机制允许在隔离环境中执行草稿,甚至支持异步回调的完整测试。

草稿 生成快照 沙箱执行 异步回调 快照自动过期
🔒

快照隔离

执行前冻结草稿状态为快照。执行期间草稿可继续编辑,互不影响

🔄

回调恢复

异步回调到达时,优先从快照恢复定义;快照过期则回退到实时草稿

🧹

自动回收

快照设有过期时间,无需人工清理,避免测试数据长期占用资源

07 Publish

安全发布:从草稿到生产

沙箱验证通过后,草稿需要被发布为正式版本。发布是高风险操作——它直接影响生产流量。我们通过多重保障确保发布过程的安全性。

01

画布校验

检查画布完整性,必须包含唯一的事件触发节点作为入口

02

事件模型锁定

首次发布锁定触发事件,后续发布必须一致,防止订阅断裂

03

分布式锁 + 事务

获取锁后在事务中切换版本,冲突时自动补偿恢复旧版本

核心原则:同一工作流 始终只有一个生效版本,分布式锁 + 事务 + 补偿三重保障并发安全和数据一致性。

08 Publish

多版本管理与秒级回滚

发布不是一锤子买卖。每次发布都生成不可变的版本快照,所有历史版本完整保留。如果新版本出现问题,可以秒级回滚到任意历史版本。

📌 版本不可变性

  • 每次发布生成独立版本,节点和连线被冻结
  • 正在运行的执行始终使用启动时的版本
  • 新版本发布不会影响正在运行的工作流

⚡ 秒级回滚

  • 一键将任意历史版本设为生效版本
  • 同样受分布式锁保护,并发安全
  • 所有历史版本保留,随时可回滚

关键设计:执行启动时锁定版本号,后续发布和回滚 不影响任何正在运行的执行,新旧版本平滑过渡。

09 Execute

执行触发:从事件到上下文

版本发布后,当外部事件到达时,引擎如何启动一次执行?这一步将"静态定义"转化为"动态运行"——创建执行上下文,构建依赖图,调度第一个节点。

外部事件到达 加载生效版本 创建执行上下文 构建依赖图 调度起始节点

上下文 = 执行的中枢

承载执行元信息、节点状态、节点输出、依赖关系图。所有节点通过上下文读写数据、感知全局状态。

状态管理委托

上下文不直接存储状态,而是委托给 StateManager。同步执行用内存,异步执行用持久化存储——引擎逻辑完全无感知。

循环子执行场景下,子上下文自动继承父上下文的数据,支持批量处理业务(如批量 KYC 验证)。

10 Execute

数据流转与节点调度

上下文创建后,引擎开始按依赖关系图调度节点。每个节点执行前解析输入参数,执行后将输出写入上下文,供下游节点引用。

📐 变量解析

  • 每个节点声明所需参数和来源
  • 引用上游节点输出 — 动态数据流转
  • 常量赋值 — 固定配置参数
  • 自动类型转换 + 默认值兜底

🔀 DAG 调度

  • 工厂模式匹配节点执行器
  • 标准化生命周期:检查 → 执行 → 采集
  • 依赖计数归零即触发后继节点
  • 多分支可并行执行,提升吞吐
流程控制KYC 验证KYB 企业 计算服务人工审核条件路由

当前已有 50+ 节点类型,每种类型对应独立的执行器实现,通过统一工厂分发。

11 Wait

双模执行:快与稳的统一

节点执行过程中,有些工作流秒级完成,有些需要等待外部回调数天。如何用一套引擎同时支撑两种场景?答案是状态管理的策略模式。

⚡ 同步模式 — 速度优先

  • 状态保存在内存,单次请求闭环
  • 适合无外部等待的短链路工作流
  • 请求结束即释放资源

🔄 异步模式 — 稳定优先

  • 状态持久化到 Redis,跨请求、跨重启
  • 适合包含 KYC、人工审核等长等待节点
  • 支持故障恢复和断点续执

引擎通过 StateManager 接口委托状态读写。切换模式只需替换实现,引擎核心代码零改动。包含回调类节点的工作流自动使用异步模式。

12 Wait

异步状态:长时运行的骨架

异步模式下,执行状态需要在服务重启后依然完整。我们将执行实例的全部状态结构化地持久化,确保任意时刻都能还原完整执行现场。

🔐

原子写入

事务保障状态更新不会出现中间态,节点状态流转严格有序

🧹

自动过期

执行状态设有生存周期,终态执行自动回收,无需人工清理

🔍

全貌可查

任意时刻可查询完整执行快照:哪些节点已完成、哪些在等待

执行元信息节点状态节点输出 运行队列等待队列回调注册触发数据
13 Wait

Callback 回调:连接外部世界

当 KYC 验证、人工审核等节点需要等待外部系统响应时,引擎将执行"挂起"并注册回调。外部系统完成后通过回调接口唤醒执行,自动续接后续节点。

节点进入等待 注册回调 外部系统处理 回调到达 恢复上下文 续接执行

回调类型

🪪 KYC 验证🤖 AI 审核👤 人工审核📝 用户输入🔗 外部系统

原子恢复机制

回调到达时,引擎先检查上下文是否在内存中;若服务已重启,则从持久化存储原子地恢复完整上下文后再处理——保证不丢失、不重复。

14 Wait

超时保护与容错策略

外部系统可能永远不响应,节点可能执行失败。我们设计了多层防护网,确保系统不会因等待或异常而"卡死"。

⏱️ 双层超时保护

  • 工作流级 — 整体执行 Deadline,超时终止全部
  • 回调级 — 单节点等待上限
  • 超时策略可配置:失败 / 跳过 / 使用默认值
  • 通过分布式任务调度精准触发

🛡️ 三级容错策略

  • 节点级 — 标记关键/非关键,关键节点失败终止流程
  • 工作流级 — 严格 / 宽松 / 尽力完成三种策略
  • 回调级 — 超时后降级处理
  • 容错策略在发布时锁定,执行期间不可变
15 Recover

故障恢复:服务重启零丢失

异步执行可能持续数小时甚至数天。如果服务在等待回调期间崩溃了,执行会丢失吗?不会。基于持久化状态和租约机制,引擎在重启后自动恢复所有中断的执行。

01

启动预热

服务启动后等待所有依赖组件就绪,确保恢复操作有完整的基础设施支撑

02

租约竞争

多实例部署时,通过短期租约抢占恢复权,防止多个实例重复恢复同一执行

03

上下文重建

从持久化存储还原完整执行状态和依赖图,调度所有未完成节点继续执行

租约自动过期——即使恢复节点本身崩溃也不会造成死锁。恢复后的执行与正常执行 行为完全一致

16 Recover

自治运维:自清理与优雅停机

除了故障恢复,系统还需要日常"自我维护"能力。定时清理回收过期资源,停机时确保在途执行安全完成,避免产生新的孤儿。

🕐 定时清理

  • 自动清除已终态的孤儿执行记录
  • 扫描并回收过期的草稿执行索引
  • 全自动运行,零人工干预

🛑 优雅停机

  • 停机信号到达后立即拒绝新请求
  • 等待所有在途执行完成(可配置超时)
  • 取消已注册的超时调度任务
  • 确保退出时不产生新的孤儿执行

故障恢复 + 定时清理 + 优雅停机,三者协同构成完整的 自治运维闭环

17 Observe

Metrics:实时健康感知

系统运行起来后,如何知道它是否健康?我们在引擎核心路径上埋入了多维度指标,实现秒级监控和异常告警。

📈 Workflow 维度

启动数完成数实时活跃数 耗时 P50P95P99

🔧 Node 维度

按类型统计完成数节点耗时分布回调接收计数

⚠️ 异常维度

按来源分类异常超时触发次数恢复执行次数

指标跨异步边界追踪——即使工作流在回调后由另一个线程完成,耗时统计依然准确。

18 Observe

Trace:全链路追踪与合规审计

Metrics 告诉你"系统整体是否正常",Trace 告诉你"某一次执行到底发生了什么"。每次工作流执行的全过程都被记录,支持完整回放和合规审计。

开始 身份验证 等待回调 回调到达 风险评估 完成

异步写入

追踪数据异步落盘,不影响执行性能

多维查询

按租户 / 工作流 / 执行实例灵活检索

合规审计

完整记录每个节点的输入输出和时间戳,满足合规要求

Metrics(实时监控)+ Trace(历史回溯)双线并行,构成完整的 可观测性体系

19 Extend

SPI 扩展:即插即用的节点生态

当业务需要新的节点类型时,如何扩展引擎?通过 SPI 机制,新增节点只需实现标准接口并注册声明,引擎启动时自动发现和加载——无需改动引擎核心任何一行代码。

实现节点接口 注册声明 引擎自动发现 序列化自动适配 可用
🔌

零侵入

扩展新节点无需修改引擎核心,完全增量式开发

🔍

自动发现

启动时扫描注册文件自动加载,无需手动配置

🛡️

类型安全

多态序列化自动注册,运行时无类型错误风险

20 Extend

多维扩展:引擎只定义契约

SPI 扩展不仅限于节点。引擎的四个核心模块都通过接口抽象,任何实现都可以被替换——这是面向接口编程的彻底实践。

🧩

节点类型扩展

实现执行器接口即可新增节点类型,当前已有 50+ 种,随业务持续增长

💾

状态存储扩展

StateManager 接口抽象状态读写,可替换为任意持久化方案

📡

追踪采集扩展

TraceCollector 接口定义追踪契约,可对接不同的可观测平台

⏱️

超时调度扩展

Scheduler 接口封装超时管理,可替换底层调度引擎实现

核心引擎 只依赖接口,不依赖任何具体实现。存储、追踪、调度都可以独立演进而不影响执行逻辑。

21 Summary

设计哲学:贯穿始终的原则

回顾整个引擎的设计,有几条原则贯穿了从草稿到执行到恢复的每一个环节。

不可变优先

版本发布后冻结、执行启动时锁定版本号、容错策略不可变。不可变性消除了并发竞争和状态不一致。

面向接口解耦

StateManager、TraceCollector、Scheduler 都是接口。核心引擎只定义契约,不绑定实现。

自愈优于人工

故障恢复、定时清理、优雅停机——系统能自己处理的问题,不应该留给运维。

快照隔离

沙箱快照、版本锁定——正在运行的执行不会被外部变更干扰。

优雅降级

三级容错策略、超时默认值、非关键节点跳过——系统在异常时仍能给出"最佳可用"结果。

全链路可观测

Metrics + Trace 双线覆盖。不可观测的系统等于不可信任的系统。

22 Summary

Engineering Highlights

🛡️

可靠性

双模状态 · 故障自动恢复 · 优雅停机 · 原子回调恢复

🧩

可扩展

SPI 零侵入扩展 · 50+ 节点即插即用 · 四维接口解耦

📊

可观测

实时 Metrics · 全链路 Trace · 合规审计支撑

🚀

安全发布

多版本不可变 · 秒级回滚 · 事件模型锁定 · 并发保护

开发效率

沙箱测试 · 草稿 Fork · DAG 可视化编排

生产就绪

分布式锁 · 双层超时 · 三级容错 · 自动清理

23

By the Numbers

50+
节点类型
2
执行模式
3
级容错策略
4
维扩展接口
秒级
版本回滚
人工干预恢复

What's Next

未来展望

🎬

可视化执行回放

基于 Trace 数据在画布上动态回放执行过程

🏪

节点市场生态

开放节点注册,支持团队间共享和复用

🤖

智能编排建议

AI 辅助工作流设计,推荐最优节点组合

📈

性能基准体系

建立压测基线,持续跟踪吞吐和延迟指标

Q & A

Thank You