本文作者: 葱油饼,观远前端工程师,落地团队开发规范,开发质量与速度并存,致力于打造更易用的 ABI 产品。
背景
先举个简单的例子,因为工作需要,你可能每天要从数据库抽取数据,然后做成报表,最后以邮件的形式发送给相关的领导。但是每个领导可能需要看的东西不一样,你需要在做成报表前对数据做下筛选和处理,那么每天这个重复的流程,是不是可以抽象成为一个具体的工作流程,把每个步骤具象成一个功能结点,然后以任务的形式串联起来,通过 DAG 的可视化形式展现出来,每天定时跑一下就可以了呢?为此,我们会需要一个工作流来标准化和自动化这个流程。
那工作流是什么?DAG 又是什么?下面让我们进入今天的内容。
前言
这篇文章会讲解我们 Universe(观远三大产品线之一,即观远数据的智能数据开发平台)里的工作流和 DAG 这两个概念,然后展开介绍一些其他内容。整体分为四个部分:
- 开发平台里的工作流;
- 如何抽象实现 DAG;
- 其他工作流介绍;
- 基于工作流和 DAG 的总结与思考。 接下来让我们开始吧~
一、工作流
首先简单介绍下 Universe 里的工作流:
实现各类任务的依赖关系、调度顺序设计,对流程进行可视化、低代码的设计及管理,对任务节点进行快速且高可用的配置,来处理一系列的数据任务;并且可以在约定时间/满足事件依赖后运行,有序调起各个任务节点,自动完成数据处理过程,具有简单易用、高可靠性及高扩展性等优势。
根据这段描述,我们可以简单总结出工作流的两个核心能力:
- 调度;
- 配置化(节点)。
下面详细介绍下这两个核心能力。
1.1 调度
开发平台支持基于 Cron 表达式的定时调度和基于输入源数据依赖的事件调度,其中定时调度采用 quartz 分布式调度器。 具备以下几点特性:
- 高可用性
-
- 通过 DAG 实现任务节点的可视化编排,无须复杂的平台语言学习成本,任务调度开箱即用;
- 支持配置顺序调度、成功调度、失败调度等多种调度关系,灵活调整调度策略;
- 支持按时、按天、按周、按月等定时运行工作流,运行结果可快速推送至钉钉、企业微信等平台,一次配置,持续可用。
- 高可靠性:去中心化的多Master和多Worker分布式架构, 避免单点故障,增强系统可靠性。
- 高扩展性:可以基于 SDK 开发自定义任务类型和流程无缝衔接。
1.1.1 定时调度
支持以每天/每周/每月/每年并精确到分钟的形式和间隔时长(时/分)的形式去设置定时。
举个例子:我期望工作流每天早上 7 时和晚上 21 时去运行,那我就可以选择 每天 - 7时/21时 - 00 分的形式,也可以设置分钟/时的间隔时间去运行。
1.1.2 事件调度
一般工作流都会有数据源依赖,比如数据集/数据库,当开启依赖的数据源全部更新的时候,工作流可以自动去运行一次。
1.2 配置化
基于一个约定式的配置描述,产出一个可交互的 UI,用于构建目标对象。
调度的目的是运行工作流,工作流的运行依赖于不同任务节点的配置,不同的配置必然会存在不一样的 UI 组件,那如何能用已知的数据结构去组装一个可视化的 UI 呢?答案就是配置化。
我们基于一个配置描述(对象)去进行读取,然后根据配置渲染对应的组件,同时把组件的值集中设置到一个总的配置对象里,从而完成了从描述到 UI 再到目标对象构建的一个过程。下面我会简单的举三个例子来说明配置化的强大与魅力。
1.2.1 基础能力
如果我们需要构建如下的一个目标对象:
{
name: '',
description: '',
}
然后我们就会有以下一段配置描述:
[
{
fieldName: 'name',
label: '名称',
type: 'STRING',
defaultValue: '',
},
{
fieldName: 'description',
label: '描述',
type: 'TEXT',
defaultValue: '',
},
]
生成的 UI 如下:
1.2.2 动态能力
很多时候我们会需要动态实现一个目标对象,什么意思呢?就是选择一个属性的不同值,动态使用一个属性组合成一个新的目标对象,那对应到 UI 上就是选择不同属性值对应展示不同的组件,那光靠我们的基础能力去实现,显然无法做到。
比如我想计算一个图形的面积,如正方形需要的是边长属性,而圆需要的是半径属性,那目标对象和 UI 就会变成:
- 选择正方形时
{
shape: 'square',
side: 8,
}
- 选择圆形时
{
shape: 'circle',
radius: