【Summary】

TaskFlow 是一个为了 openstack 实现的 python 库,使得执行 task 变得简单,一致,易扩展,可靠;

它能以一种声明的方式,将轻量级 task 对象的创建与 flows 结合起来;

它以一个可以声明的方法可以使得其包含的 engines 去运行这些 flows,这些 flow 可以被停止,继续,或者是安全回滚;

使用 TaskFlow 可以享受以下特性:

更多的弹性状态;

自然声明构造;

更易于测试(由于 task 包括且只包括一件事);

工作流插件化;

容错性;

简化 crash 后的恢复;

 
 

【Why TaskFlow?】

如今 openstack 代码已经有组织的增长,但是对于去操作序列化的代码,没有一个标准和一致的方法,使得当调用过程意外被终止时,代码流程可以安全的继续或者回滚;

大多数 projects 甚至没有让 tasks 可重启与可恢复;

简单的跳过或者恢复的场景在如今的代码里已经几乎不可能;

Task 可以轻松地解决这些问题;

 
 

【Conceptual example】

下面这段伪代码描述了一个 flow 是如何像 sql 事务一样工作的;

START TRANSACTION

task1: call nova API to launch a server || ROLLBACK

task2: when task1 finished, call cinder API to attach block storage to the server || ROLLBACK

...perform other tasks...

COMMIT

 
 

【Service stop/upgrade/restart (at any time)】

在组件运行时,openstack 的一个典型的问题是,当 daemon 被强制 stop 时(比如升级,硬件故障,维护中以及其他一些原因),daemon 会发生什么;

service stop [glance-, nova-, quantum…]

现在许多 openstack 的组件没有处理强制 stop,使得把系统状态置于一个可调解的状态中;

 
 

典型的操作是当一个 service 执行时,被瞬间强制 stop,不能被恢复而且在某种程度上会被遗忘(后续一个 scanning 进程可能会尝试清理这些孤儿资源);

在这种情况下,Taskflow 会通过追踪这些 actions, tasks 和他们有关的 states 使得当 service 被 restart(甚至 upgrade 之后) 的时候,service 可以轻松地对那些被 stop\kill 命令打断的 tasks 继续或者回滚;

 
 

这将有助于一个容错性的架构,避免孤儿资源,减少将来的 daemon 进程去尝试清理相关工作的需要;

 
 

【Orphaned resources】

由于缺少事务的语义,许多 openstack 的 projects 会使 resource 处于一个孤儿状态,或者称作 ERROR 状态;

如果 openstack 被自动化系统(比如 Heat)驱动,那么这在很大程度上是不可接受的,它无法分析出哪些孤儿资源需要被清理;

Taskflow 通过提供以 task 为导向的模型,使得语义可以被用作正确地追踪资源的修改轨迹;

这使得所有在一个(或一组)资源可以自动地被解开,以保证没有资源被遗漏;

 
 

【Metrics and history】

当 openstack 的 services 被结构化为 task 和 flow 对象与模式以后,它们能够自动轻松地为 service 添加 metric reporting 和 action history,只需运行一个 task 或者 flow 时,通过 taskflow 去记录 metric 或者 history 就行了。

在各个 openstack service 中,对于实现这个类似的特性有着各自的方法,但是通过 taskflow 这些不同的方法会变成一个统一的方法;

开发者使用 taskflow 不需要关心 taskflow 如何记录的这个信息;

这帮助将 metric & history 与 task 和 flow 的有关的代码同真正定义 task 和 flow 的 action 的代码分离开;

 
 

【Progress/status tracking】

在许多 oepnstack 的项目里,需要尝试去展示这个项目的动作执行情况;

不幸的是,这个需求在不同的项目中实现也是不同的,从而导致不一致和进度\状态的汇报或者追踪不是那么的准确;

Taskflow 提供了一个底层的机制,通过让你自己在 taskflow 内置的 notification 系统里面插入与添加,使得追踪进程更加简单;

这避免了在 action 中添加代码,在 action 中添加代码是不好的,那样会使 action 难以理解,调试和检查;

通过 status\progress tracking 的代码与真正操作 action 的代码解耦,同样使得进度\状态机制在将来的改动中更加弹性化;

 
 

······【Structure】

【Atoms】

atom 是 taskflow 中的最小执行单位,作为其他 class 的基类;

atom 有自己的 name 和 version;

atom 需要为自己的输入参数和输出参数进行命名;

 
 

【Tasks】

task 是一个关于可以执行或者回滚的有关 work 的操作序列;(类似于一个 function)

task object 继承于 BaseTask,一个定义了 task 必须提供的属性项与方法的类;

现在提供两种 task 的子类:

Task:自己继承并创建 subclass;

FunctorTask:封装已经存在的 function 到 task object 里;

 
 

【Retries】

retry 是从 atom 派生的一个特殊的 work 单位,可以处理错误,控制流的执行以及通过配置必要的参数尝试其他的 atoms;

当一个相关的 atom 失败,这些 retry unit 会被询问,从而决定解决的策略;

目标是使得 retry atom 通过这个询问, 可以提供一个解决这个 failure 的策略;(可能是通过重试,回滚一个单独的 atom,或者回滚和这个 retry 相关的代码)

继承这个 retry 的 base class 必须提供一个叫 on_failure 的方法,去决定应该如何去处理一个 failure;

 
 

【Flows】

flow 是一个可以将一个或多个 tasks 以一个有序的顺序链接到一起的结构;

当 flow 回滚时,它对每一个子 tasks 执行回滚的代码,使用各自 tasks 已经定义好的 reverting 机制;

 
 

【Engines】

task 如何从 pending 状态到 failed 或者 success 状态;

目的是可靠地运行你的 workflow,处理这些控制和执行流;

这使得使用 taskflow 库的代码只需要担心 workflow 的形式,而不需要担心执行,回滚和恢复;

 
 

【Jobs】

如何对 tasks 和 flows 提供高可用和可扩展,保证将来的进程无论发生多少 crash 和 failure,机器运行工作负载正常;

这个概念使得使用 taskflow 进行编码不需要担心分布式和对 workflow 的高可用;

 
 

【Conductors】

即插即用的方式,对于一个个体,不同的概念去使用运行时间单元;

 
 

【States】

一个 flow 或者一个 task 可能经历的潜在的状态变化;

 
 

【Notifications】

如何获取关于状态变化,任务结果,任务进度,工作提交以及其他;

 
 

【Reversion】

tasks 和 flows 均可以通过执行相关 task 对象的 rollback 代码来实现回滚;

比如,如果一个 flow 被要求创建一个带有块存储 volume 的 server,通过包含两个 tasks;

task1: create server || rollback by delete server

task2: create+attach volume || rollback by delete volume

如果 attach 操作失败,flow 中所有的代码会被回滚,导致创建出来的 server 和 volume 都会被删掉;

 
 

【Persistence】

taskflow 可以保存当前 atom 的状态,进度,参数和结果,flow、job 以及对于数据库的操作也可以,这使得 flow 和 atom 的 resumption, check-pointing 和 reversion;

一个持久化的 api,以及一个持久化的 base 类型,使用了 taskflow 提供的方法,目的是保证 jobs,flows 和那些相关的 atoms 可以在数据库或者内存中做 backup;

 
 

【Resumption】

如果一个 flow 被启动,但是在完成前被打断了,这个 flow 会在它上一个 checkpoint 安全的继续;

它允许对服务进行安全和简单的 crash recovery;

Taskflow 对 checkpoint log 提供了不同的持久化策略,使你作为一个 application 开发者可以挑选适合 application 使用和期望能力的一种;

 
 

openstack-taskflow 组件记录的更多相关文章

  1. OpenStack共享组件

    一.云计算的前世今生 1.物理机架构,应用部署和运行在物理机上  2.虚拟化架构,物理机上运行若干虚拟机,应用系统直接部署到虚拟机上  3.云计算架构,虚拟化提高了单台物理机的资源使用率 二.Open ...

  2. OpenStack各组件逻辑关系、通信部署关系及工作流程

    一. OpenStack组件之间的逻辑关系 OpenStack 是一个不断发展的系统,所以 OpenStack 的架构是演进的,举个例子: E 版本有5个组件  Compute 是 Nova:Imag ...

  3. openstack及组件简要介绍

    为什要用云? 一.简单的说就是对资源更加合理的分配,使用,比如硬件的数量,带宽等等这些,因为你不能机器买来不需要了再卖掉(当然也可以),带宽跟机房签合同得来一年的,中间不够了也不能加,超了也不退钱 二 ...

  4. OpenStack各组件详解和通信流程

    一.openstack由来 openstack最早由美国国家航空航天局NASA研发的Nova和Rackspace研发的swift组成.后来以apache许可证授权,旨在为公共及私有云平台建设.open ...

  5. openstack共享组件——Memcache 缓存系统(4)

    云计算openstack共享组件——Memcache 缓存系统(4)   一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Netw ...

  6. OpenStack基础组件安装keystone身份认证服务

    域名解析 vim /etc/hosts 192.168.245.172 controller01 192.168.245.171 controller02 192.168.245.173 contro ...

  7. 八、OpenStack—Cinder组件安装

    一.安装和配置控制器节点 1.先决条件 1)创建数据库 # mysql -u root -p 2)创建cinder数据库 MariaDB [(none)]> CREATE DATABASE ci ...

  8. 二、OpenStack—keystone组件介绍与安装

    一.Keystone介绍 keystone 是OpenStack的组件之一,用于为OpenStack家族中的其它组件成员提供统一的认证服务,包括身份验证.令牌的发放和校验.服务列表.用户权限的定义等等 ...

  9. openstack 之~openstack各组件关系

    认识openstack 第一:openstack是什么? OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项 ...

随机推荐

  1. 磨刀-CodeWarrior11生成的Makefile解析

    https://mp.weixin.qq.com/s/plvviDFLsLQeg9ZeP_3WMA   一. 简介 Code Warrior 11是基于Eclipse CDT开发的集成开发环境(IDE ...

  2. 高性能可扩展mysql 笔记(二)用户模型设计、用户实体表结构设计、设计范式

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.用户模型设计 电商羡慕中用户模型的设计涉及以下几个部分: ​ 以电商平台京东的登录.注册页面作为例: ...

  3. Java实现 LeetCode 794 有效的井字游戏 (暴力分析)

    794. 有效的井字游戏 用字符串数组作为井字游戏的游戏板 board.当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回 true. 该游戏板是一个 3 x 3 数组,由字 ...

  4. Java实现蓝桥杯 算法提高 盾神与积木游戏

    题目描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他 小朋 ...

  5. (Java实现) 装载问题

    2.装载问题 [问题描述] 有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi.找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船. [ ...

  6. Java实现 LeetCode 538 把二叉搜索树转换为累加树(遍历树)

    538. 把二叉搜索树转换为累加树 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和 ...

  7. Java实现 LeetCode 212 单词搜索 II(二)

    212. 单词搜索 II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中&quo ...

  8. java实现第六届蓝桥杯表格计算

    表格计算 某次无聊中, atm 发现了一个很老的程序.这个程序的功能类似于 Excel ,它对一个表格进行操作. 不妨设表格有 n 行,每行有 m 个格子. 每个格子的内容可以是一个正整数,也可以是一 ...

  9. 使用 xshell 登录 Windows 的 linux 子系统

    1 配置 SSH Server # 卸载自带的 ssh sudo apt-get remove openssh-server # 安装 ssh sudo apt-get install openssh ...

  10. Ubuntu一键安装Mariadb

    系统版本: debian/  ubuntu/ 添加清华大学镜像库: sudo add-apt-repository -r 'https://mirrors.tuna.tsinghua.edu.cn/m ...