pkg/task/README.md

124 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# BCS异步任务流框架
## 背景
* 主要为了解决项目中复杂场景(集群管理任务、资源管理、联邦集群管理任务等)的分布式并发任务处理及任务编排场景,通过统一的框架实现松耦合、易扩展的特性的任务管理系统
## 方案
## 技术方案
* 基于 [go-machinery](https://github.com/RichardKnop/machinery) 的 [Workflows](https://github.com/RichardKnop/machinery?tab=readme-ov-file#workflows) 的 **Chains** 模式,通过上层任务抽象,实现异步任务框架处理
* 依赖消息队列rabbitmmq、数据库mongo
### 任务框架
### 支持的组件
* Brokers: etcd
* Locksetcd
* Backends: etcd
### 任务框架实现功能
* 基于协程级别的轻量级任务执行
* 支持水平扩展,提升任务处理并发量
* 支持任务流处理
* 支持子任务变量共享
* 支持任务从当前失败节点重试
* 支持任务取消
* 支持任务跳过失败子任务
* 支持指定任务节点运行
* 支持自定义的任务回调机制
* 可扩展的变量渲染
* 子任务超时控制、任务超时控制机制
### 任务模型
抽象任务结构如下所示Task是主任务Step是工作流子任务通过StepSequence控制执行的顺序。
```
// Task task definition
type Task struct {
// index for task, client should set this field
TaskIndex string `json:"taskIndex" bson:"taskIndex"`
TaskID string `json:"taskId" bson:"taskId"`
TaskType string `json:"taskType" bson:"taskType"`
TaskName string `json:"taskName" bson:"taskName"`
// steps and params
CurrentStep string `json:"currentStep" bson:"currentStep"`
StepSequence []string `json:"stepSequence" bson:"stepSequence"`
Steps map[string]*Step `json:"steps" bson:"steps"`
CallBackFuncName string `json:"callBackFuncName" bson:"callBackFuncName"`
CommonParams map[string]string `json:"commonParams" bson:"commonParams"`
ExtraJson string `json:"extraJson" bson:"extraJson"`
Status string `json:"status" bson:"status"`
Message string `json:"message" bson:"message"`
ForceTerminate bool `json:"forceTerminate" bson:"forceTerminate"`
Start string `json:"start" bson:"start"`
End string `json:"end" bson:"end"`
ExecutionTime uint32 `json:"executionTime" bson:"executionTime"`
MaxExecutionSeconds uint32 `json:"maxExecutionSeconds" bson:"maxExecutionSeconds"`
Creator string `json:"creator" bson:"creator"`
LastUpdate string `json:"lastUpdate" bson:"lastUpdate"`
Updater string `json:"updater" bson:"updater"`
}
// Step step definition
type Step struct {
Name string `json:"name" bson:"name"`
Method string `json:"method" bson:"method"`
StepName string `json:"stepname" bson:"stepname"`
Params map[string]string `json:"params" bson:"params"`
// step extras for string json, need client step to parse
Extras string `json:"extras" bson:"extras"`
Status string `json:"status" bson:"status"`
Message string `json:"message" bson:"message"`
SkipOnFailed bool `json:"skipOnFailed" bson:"skipOnFailed"`
RetryCount uint32 `json:"retryCount" bson:"retryCount"`
Start string `json:"start" bson:"start"`
End string `json:"end" bson:"end"`
ExecutionTime uint32 `json:"executionTime" bson:"executionTime"`
MaxExecutionSeconds uint32 `json:"maxExecutionSeconds" bson:"maxExecutionSeconds"`
LastUpdate string `json:"lastUpdate" bson:"lastUpdate"`
}
// StepWorkerInterface that client must implement
type StepWorkerInterface interface {
GetMethod() string
DoWork(task *types.Task) error
}
// CallbackInterface that client must implement
type CallbackInterface interface {
GetName() string
Callback(isSuccess bool, task *types.Task)
}
// TaskMgr build task
type TaskMgr interface {
Name() string
Type() string
BuildTask(info types.TaskInfo, opts ...types.TaskOption) (*types.Task, error)
Steps(defineSteps []StepMgr) []*types.Step
}
// StepMgr build step
type StepMgr interface {
Name() string
GetMethod() string
BuildStep(kvs []KeyValue, opts ...types.StepOption) *types.Step
DoWork(task *types.Task) error
}
```
* Task 是主任务,控制子任务执行顺序以及子任务的执行参数,并存储子任务共享变量,同时负责子任务的切换以及主任务的状态更新。
* Step 是工作流子任务,进一步抽象是 接口StepWorkerInterface实现重要的业务逻辑。而通过对接口StepWorkerInterface抽象封装来实现任务切换和子任务状态更新
* StepMgr 为构建step子任务 以及 step子任务的业务逻辑执行体
* TaskMgr 为构建task任务
* CallbackInterface 注册回调方法
### 示例代码
接入框架的示例代码可参考 task 目录下的 example 例子