# orderlines
**Repository Path**: lucifer2008_admin/orderlines
## Basic Information
- **Project Name**: orderlines
- **Description**: 工作流框架
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2024-09-20
- **Last Updated**: 2024-09-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
orderlines
使用python开发的一套工作流框架
### 一、设计思路
流程的使用链表进行串联 插件库就是我们具体要运行的任务,插件库中有基本的标准库,如start, end, process_control, parallel, group,common, 启动start,
end作为内置BuiltIn模块。common是支持我们自主进行编写的任务插件库,process_control, parallel作为网关控制我们任务的运行顺序,group作为抽象任务其中可以包含多个任务。
当然我在设计的过程中有借鉴很多其他的优秀模块,比如python中很出名的airflow框架,以及著名的测试框架`robotframework`。我的表结构设计是借鉴airflow的,组件库的思路是借鉴`robotframework`
的。但是我在本质上还是和他们有很大的区别的。比如airflow是有向无环图,`orderlines`是链表,因为我需要做循环所以我要使用链表。当然我觉得很多好的项目都是站在别人的肩膀上。
为什么要做这个项目呢?
- 第一:我发现python中没有一个模块可以全部支持,流程判断、任务组、并行这三个功能的工作流。
- 第二:我在之前的工作中都是有关于自动化的、所以我想有个属于自己理想的框架,来比较灵活的应对业务的复杂性。
- 第三:很多工作流都是代码生成图形,我想开发个低代码的平台,更加方便的使用。
### 二、架构设计
#### 2.1、架构图

- Web UI指的是相配套的前端页面,通过接口查看、创建、控制流程。gRPC用grpc接口控制流程。
- Web Server服务器。可以接受http请求,用于提供用户界面的操作窗口,主要负责操作,查看流程等。
- Schedule定时器。负责定时任务,周期任务,间隔任务,将流程交给Executor执行。
- Executor执行器。主要负责流程的运行,以及异常的处理。把每个流程中的任务解析运行。
- worker负责具体的流程运行,目前默认使用celery作为执行者。
- database数据库。存储流程信息,流程实例,任务信息,任务实例等相关数据。
#### 2.2、业务模型

关于`orderlines`中很重要的一些概念就是流程、流程实例、任务、任务实例、以及组件库和网关。
- 流程:如上图所示是一个流程。**流程是由一系列的任务组合而成的**。可以使用一个链表来表示。**每个任务代表一个节点。**
- 流程实例:流程实例是流程运行之后所产生的一个流程运行信息。简单来说就是**流程是流程配置信息,流程实例是流程的运行信息**。
- 任务:任务是我们的业务。流程是有一系列有意义的任务所组成的,**任务也就是流程的最小单位**,当然任务中还分为很多种,比如流程网关、业务任务。
- 任务实例:也是比较好理解,是任务运行后所产生的任务运行信息。和**流程实例是一对一的关系**,每个任务实例只对应一个流程实例,一个任务可以对应多个任务实例。
- 组件库:是针对于业务类型创建的对应的类库,可以参考[自定义插件](./docu/后端文档/2-插件管理/自定义插件.md)了解组件库。
- 网关:是框架提供了三个特殊的方法,方便适配业务操作。可以参考[标准库](./docu/后端文档/2-插件管理/标准库.md)。
#### 2.3、设计亮点
- 有相对完整的前端页面,可以控制和创建流程。
- 实现了**任务组,流程控制,并行任务**三种任务网关,可以实现循环。
- 细分任务。针对业务设计了**有状态任务和独占任务**,应对不同的工作流场景。
- 组件库方式。可以针对**不同的业务对应开发不同的组件**,方便业务解耦。
- 提供了三种异常处理策略,**重试,报错,跳过**。
- 支持debug模式。
### 三、功能特点
- 基本涵盖了工作流所需要的所有功能,串行,并行,流程控制,任务组
- 定时细分:**定时执行,间隔执行,周期执行**(`cron`表达式)
- 任务细分:
- 根据任务状态可以分为——有状态任务(任务本身有状态)无状态任务(任务本身没有状态)
- 根据任务是否可以被同时运行——独占任务(不同流程只能同时运行一个),普通任务(不同流程可以同时运行多个任务)
- 插件方式扩展功能,可以自定义插件适用于不同的业务功能,方便业务功能的解耦
- 灵活的流程构建和启动方式
- 构建方式
- 通过配套的前端进行配置
- 通过`yaml`文件和`json`文件
- 命令行配置
- 启动方式
- `http`接口启动
- `grpc`启动
- 命令行启动
- 流程告警,异常处理,异常通知更加灵活
- 异常处理方式分为**报错,忽略,跳过**(后续会增加忽略此类告警等功能)
- 异常通知可以通过自定义组件灵活扩展适配到钉钉,企业微信,飞书,短信等方式
### 四、相关文档
- [标准库](./docu/后端文档/2-插件管理/标准库.md)
- [自定义插件](./docu/后端文档/2-插件管理/自定义插件.md)
- [配置管理](./docu/后端文档/3-配置管理/配置管理.md)
### 五、功能介绍
- 基本功能
- 流程串行,基本功能
- 定时任务,定时执行,间隔执行,周期执行
- 流程版本,一个流程可以对应多个版本
- 变量解析
- 任务返回值,返回值进行**四则运算和变量拼接**。(返回值使用`mongodb`或者`redis`进行存储——开发中)
- 运行时增加运行参数变量, 参数变量可以在流程中使用
- 任务网关
- 流程控制, 根据任务运行状态和上个节点的返回值运行
- 任务组,多个任务合成一个任务
- 流程并行(可选择使用**协程io密集型和进程cpu密集型**)
- 自定义插件
- 支持自定义插件安装,方便业务功能扩展
- 任务处理
- 任务超时,给定超时时间(开发中)
- 异常处理策略,**重试,忽略,抛错**
- 任务回调,**特定任务状态(成功,失败,超时,忽略,重试)**可以指定回调函数
- 任务停止,支持有无状态任务和有状态任务的停止
- 使用模式
- 支持http接口操作
- 命令行模式,详情查看orderlines --help
- 增加grpc方式操作
- 权限控制
- rbac权限,支持角色和群组两种模式
- 流程配置
- 前端配置界面
- 支持yaml文件,json文件创建
- 部署方式
- docker-compose一键式部署
### 六、页面介绍
#### 6.1、首页
#### 6.2、数据大屏
#### 6.3、流程配置
#### 6.4、流程运行
#### 6.5、流程管理
#### 6.6、流程告警
#### 6.7、插件管理
#### 6.8、权限管理
#### 6.9、系统管理
### 七、状态介绍
#### 7.1、流程状态图
```python
import enum
class ProcessStates(enum.Enum):
green = 'SUCCESS' # 成功
red = 'FAILURE' # 失败
yellow = 'STOP' # 停止
grey = 'PENDING' # 排队
blue = "RUNNING" # 运行
purple = "PAUSED" # 暂停
orange = "TIMEOUT" # 超时
```
#### 7.2、任务状态图
```python
import enum
class TaskStates(enum.Enum):
grey = 'PENDING'
blue = 'RUNNING'
red = 'FAILURE'
green = 'SUCCESS'
yellow = 'STOP'
orange = 'TIMEOUT'
purple = "PAUSED"
```
### 八、启动方式
#### 8.1、docker启动, 直接部署
```shell
bash deploy.sh
```
#### 8.2、命令行启动
```shell
# 先进行打包
pip install --editable .
# 查看命令行帮助
orderlines --help
Commands:
build-process-by-json build process by json file.
build-process-by-yaml build process by yaml file.
create-super-user create a super administrator.
create-user create a super administrator.
paused-process pause process by process instance id.
recover-process recover process by process instance id.
run-grpc run grpc server.
runserver run orderlines server, default port 15900.
schedule start schedule plan.
start-process start process by process instance id.
stop-process stop process by process instance id.
# 启动命令
orderlines run-server # 启动flask服务
orderlines schedule # 启动定时器
orderlines run-grpc # 启动grpc
celery -A celery_worker.celery worker --loglevel=info --pool=solo # 启动celery
```
#### 8.3、测试启动
```shell
# 启动celery
cd src
celery -A celery_worker.celery worker --loglevel=info --pool=solo
# 启动flask
python app.py # 启动flask
```