LightFlow:一个基于函数式编程的任务编排框架

在现代软件开发中,任务流的管理常常让人头疼。现在,LightFlow 诞生了!这是一个基于 Go 语言的任务编排框架,旨在简化复杂任务流的设计与管理。通过函数式编程,LightFlow 使开发者能够在代码中直接定义任务流,将重点放在任务的执行时机,而无需繁琐的配置文件和规则。

为什么选择 LightFlow?

  1. 简化任务流管理:告别外部规则语言,LightFlow 允许开发者在代码中定义所有任务依赖,减少频繁切换上下文的烦恼。
  2. 专注执行时机:只需明确任务的依赖步骤,框架将自动处理任务执行顺序,极大降低全局依赖管理的复杂性。
  3. 提升维护性和可扩展性:即使任务流不断扩展,确定任务执行时机仍然是一项简单而基本的工作。

核心特性

  • 隔离性上下文:各个步骤通过独立的上下文链接,确保只访问相关数据,避免全局混乱。
  • 基于执行时机的编排:灵活地定义任务流,精准控制任务的执行时机,实现高效管理。
  • 流程合并功能:允许将现有流程合并到新的流程中,优化整体管理。
  • 智能资源管理:自动处理资源的分配和释放,支持断点恢复。
  • 断点恢复机制:支持任务在失败后从失败点恢复执行,避免重复运行。
  • 条件执行控制:根据条件灵活决定任务的执行与跳过。
  • 多级回调机制:在多个层级设置回调,轻松管理任务状态。
  • 强大的事件处理:处理任务执行阶段外的错误,允许为每个阶段配置事件处理器。
  • 自定义持久化插件:用户可以根据需求自定义持久化插件,LightFlow 不与任何 ORM 框架耦合,灵活性更高。

快速上手

安装

通过以下命令轻松安装 LightFlow:

shell 复制代码
go get github.com/Bilibotter/light-flow/flow

示例代码

以下示例展示了如何使用 LightFlow 进行任务编排:

go 复制代码
package main

import (
	"fmt"
	"github.com/Bilibotter/light-flow/flow"
)

func First(step flow.Step) (any, error) {
	if input, exist := step.Get("input"); exist {
		fmt.Printf("[Step: %s] get input: %v\n", step.Name(), input)
	}
	step.Set("key", "value")
	return "result", nil
}

func Second(step flow.Step) (any, error) {
	if value, exist := step.Get("key"); exist {
		fmt.Printf("[Step: %s] get key: %v\n", step.Name(), value)
	}
	if result, exist := step.Result(step.Dependents()[0]); exist {
		fmt.Printf("[Step: %s] get result: %v\n", step.Name(), result)
	}
	return nil, nil
}

func ErrorStep(step flow.Step) (any, error) {
	if value, exist := step.Get("key"); exist {
		fmt.Printf("[Step: %s] get key: %v\n", step.Name(), value)
	} else {
		fmt.Printf("[Step: %s] cannot get key \n", step.Name())
	}
	return nil, fmt.Errorf("execute failed")
}

func ErrorHandler(step flow.Step) (bool, error) {
	if step.Has(flow.Failed) {
		fmt.Printf("[Step: %s] has failed\n", step.Name())
	} else {
		fmt.Printf("[Step: %s] success\n", step.Name())
	}
	return true, nil
}

func init() {
	process := flow.FlowWithProcess("Example")
	process.Follow(First, Second)
	process.Follow(ErrorStep)
	process.AfterStep(true, ErrorHandler)
}

func main() {
	flow.DoneFlow("Example", map[string]any{"input": "Hello world"})
}

输出示例

执行上述代码后,你将看到如下输出:

shell 复制代码
[Step: First] get input: Hello world
[Step: First] success
[Step: Second] get key: value
[Step: Second] get result: result
[Step: Second] success
[Step: ErrorStep] cannot get key 
[Step: ErrorStep] has failed

使用步骤

  1. 定义步骤 :编写你的 Step 函数,使用 step.Getstep.Set 与上下文交互。查看文档
  2. 创建流程 :在 init 函数中定义流程并添加步骤。查看文档
  3. 错误处理 :利用回调管理各种错误情况。查看文档
  4. 启动执行 :调用 flow.DoneFlow 方法开始执行流程,传入必要的输入数据。

LightFlow 设计为尽可能执行所有任务,即便某个任务失败,只有依赖于该任务的后续任务会被跳过,而其他不相关的任务仍将继续运行。

这种设计支持断点恢复,确保在错误发生时系统仍能有效执行未受影响的部分。

相关推荐
终末圆20 分钟前
MyBatis—Plus 快速上手【后端 22】
java·开发语言·数据库·后端·sql·spring·mybatis
码代码的小农26 分钟前
SpringBoot自定义异常
java·spring boot·后端
岁岁岁平安30 分钟前
springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)
java·spring boot·后端·学习·threadlocal·jwt令牌
阿树梢1 小时前
【DRF】DRF基本使用
后端·python·django
peihexian1 小时前
使用rust实现rtsp码流截图
开发语言·后端·rust
影灵衣丶1 小时前
go进阶编程:设计模式之解释器模式
后端·go
Y_3_72 小时前
RabbitMQ 概述及安装 : 程序之间沟通的桥梁
开发语言·分布式·后端·程序人生·中间件·rabbitmq·学习方法
2401_857622662 小时前
SpringBoot助力墙绘艺术市场创新
java·spring boot·后端
vonlinee2 小时前
Spring系列 BeanPostProcessor
java·后端·spring
技术无疆3 小时前
【Python】Daphne:Django 异步服务的桥梁
开发语言·人工智能·后端·python·机器学习·数据挖掘·django