技术实践干货 | 从工作流到工作流

本文探讨了工作流和DAG在数据开发中的应用,介绍了工作流的调度和配置化能力,以及DAG的有向无环图概念。文章详细阐述了工作流的定时调度和事件调度功能,以及DAG在可视化流程中的作用,同时提到了n8n和Orange两个工具在工作流领域的应用。
摘要由CSDN通过智能技术生成

本文作者: 葱油饼,观远前端工程师,落地团队开发规范,开发质量与速度并存,致力于打造更易用的 ABI 产品。

背景

先举个简单的例子,因为工作需要,你可能每天要从数据库抽取数据,然后做成报表,最后以邮件的形式发送给相关的领导。但是每个领导可能需要看的东西不一样,你需要在做成报表前对数据做下筛选和处理,那么每天这个重复的流程,是不是可以抽象成为一个具体的工作流程,把每个步骤具象成一个功能结点,然后以任务的形式串联起来,通过 DAG 的可视化形式展现出来,每天定时跑一下就可以了呢?为此,我们会需要一个工作流来标准化和自动化这个流程。

那工作流是什么?DAG 又是什么?下面让我们进入今天的内容。

前言

这篇文章会讲解我们 Universe(观远三大产品线之一,即观远数据的智能数据开发平台)里的工作流和 DAG 这两个概念,然后展开介绍一些其他内容。整体分为四个部分:

  1. 开发平台里的工作流;
  2. 如何抽象实现 DAG;
  3. 其他工作流介绍;
  4. 基于工作流和 DAG 的总结与思考。 接下来让我们开始吧~

一、工作流

首先简单介绍下 Universe 里的工作流:

实现各类任务的依赖关系、调度顺序设计,对流程进行可视化、低代码的设计及管理,对任务节点进行快速且高可用的配置,来处理一系列的数据任务;并且可以在约定时间/满足事件依赖后运行,有序调起各个任务节点,自动完成数据处理过程,具有简单易用、高可靠性及高扩展性等优势。

根据这段描述,我们可以简单总结出工作流的两个核心能力:

  1. 调度;
  2. 配置化(节点)。

下面详细介绍下这两个核心能力。

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: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值