ZStack--工作流引擎

ZStack云计算架构探秘(三): 超强灵活性和可扩展性 在前面探秘一和探秘二中,我们已经分享了ZStack的拓扑结构和如何实现超高可伸缩性的能力。还记得我们在Why ZStack中说的,稳定性和灵活性是IaaS需要解决的两大问题。今天我们就来揭开ZStack超强灵活性的奥秘。 今天的内容非常的丰富,我们先来看一下什么是灵活性。所谓灵活性无非是三个方面:当需要添加新功能的时候简单方便,不拖泥带水;系统升级轻巧无障碍;IaaS云配置想改就改,无需重头搭建 阅读详情

在IaaS软件中的任务通常有很长的执行路径,一个错误可能发生在任意一个给定的步骤。为了保持系统的完整性,一个IaaS软件必须提供一套机制用于回滚先前的操作步骤。通过一个工作流引擎,ZStack的每一个步骤,包裹在独立的工作流中,可以在出错的时候回滚。此外,通过在配置文件中组装工作流的方式,关键的执行路径可以被配置,这使得架构的耦合度进一步降低。

动机

数据中心是由大量的、各种各样的包括物理的(比如:存储,服务器)和虚拟的(比如:虚拟机)在内的资源组成的。IaaS软件本质就是管理各种资源的状态;例如,创建一个虚拟机通常会改变存储的状态(在存储上创建了一个新的磁盘),网络的状态(在网络上设置DHCP/DNS/NAT等相关信息),和虚拟机管理程序的状态(在虚拟机管理程序上创建一个新的虚拟机)。不同于普通的应用程序,它们绝大多数时候都在管理存储在内存或数据库的状态。为了反映出数据中心的整体状态,IaaS软件必须管理分散在各个设备的状态,导致执行路径很长。一个IaaS软件任务通常会涉及在多个设备上的状态改变,错误可能在任何步骤发生,然后让系统处在一个中间状态,即一些设备已经改变了状态而一些没有。例如,创建一个虚拟机时,IaaS软件配置VM网络的常规步骤为DHCPàDNSàSNAT,如果在创建SNAT时发生错误,之前配置的DHCP和DNS很有可能还留在系统内,因为它们已经成功地被应用,即使虚拟机最后无法成功创建。这种状态不一致的问题通常使云不稳定。

另一方面,硬编码的业务逻辑在传统的IaaS软件内对于改变来说是不灵活的;开发人员往往要重写或修改现有的代码来改变一些既定的行为,这些影响了软件的稳定性。

这些问题的解决方法是引入工作流的概念,将整块的业务逻辑分解成细粒度的、可回滚的步骤,使软件可以清理已经生成的错误的状态,使软件变得可以配置。

注意:在ZStack中,我们可以将工作流中的步骤(step)称为“流程(flow)”,在以下文章中,流程(flow)和步骤(step)是可以互换的。

问题

错误处理在软件设计中总是一个很头疼的问题。即使现在每一个软件工程师都知道了错误处理的重要性,但是实际上,他们仍然在找借口忽略它。精巧的错误处理是很难的,尤其是在一个任务可能跨越多个组件的系统中。即使富有经验的工程师可以关注自己代码中的错误,他们也不可能为不是他们所写的组件付出类似的努力,如果整个架构中没有强制一种统一的,可以全局加强错误处理的机制。忽略错误处理在一个IaaS软件中是特别有害的。不像消费级程序可以通过重启来恢复所有的状态,一个IaaS软件通常没有办法自己恢复状态,将会需要管理员们去手动更正在数据库和外部设备中的错误。一个单一的状态不一致可能不会导致任何大的问题,而且也可能甚至不会被注意到,但是这种状态不一致性的不断积累将会在某个时刻最终摧毁整个云系统。

工作流引擎

工作流是一种方法,把一些繁琐的方法调用分解为一个个专注于一件事情的、细粒度的步骤,它由序列或状态机驱动,最终完成一个完整的任务。配置好回滚处理程序后,当错误或未处理的异常在某一步骤发生时,一个工作流可以中止执行并回滚所有之前的执行步骤。以创建虚拟机为例,主要工作流程看起来像:

在这里插入图片描述

顺序工作流,来源于链式设计模式(Chain Pattern),有着可以预见的执行顺序,这是ZStack工作流的基础。一个流程(flow),本质上是一个java接口,可以包含子流程,并只在前面所有流程完成后才可以执行。

public interface Flow {

void run(FlowTrigger trigger, Map data);



void rollback(FlowTrigger trigger, Map data);

}

在Flow接口中,工作流前进到这个流程(flow)的时候,run(FlowTrigger trigger, Map data)方法会被调用;参数Map data可以被用于从先前的流程(flow)中获取数据并把数据传递给后续的流程(flow)。当自身完成时,这个流程(flow)调用trigger.next()引导工作流(workflow)去执行下一个流程(flow);如果一个错误发生了,这个流程(flow)应该调用trigger.fail(ErrorCode error)方法中止执行,并通知工作流(workflow)回滚已经完成的流程(包括失败的流程自身)调用各自的rollback()方法。

在FlowChain接口中被组建好的流程代表了一个完整的工作流程。有两种方法来创建一个FlowChain:

1.声明式

流程可以在一个组件的Spring配置文件中被配置,一个FlowChain可以通过填写一个流程的类的名字的列表到FlowChainBuilder中以被创建。

org.zstack.compute.vm.VmAllocateHostFlow org.zstack.compute.vm.VmImageSelectBackupStorageFlow org.zstack.compute.vm.VmAllocatePrimaryStorageFlow org.zstack.compute.vm.VmAllocateVolumeFlow org.zstack.compute.vm.VmAllocateNicFlow org.zstack.compute.vm.VmInstantiateResourcePreFlow org.zstack.compute.vm.VmCreateOnHypervisorFlow org.zstack.compute.vm.VmInstantiateResourcePostFlow

FlowChainBuilder createVmFlowBuilder = FlowChainBuilder.newBuilder().setFlowClassNames(createVmWorkFlowElements).construct();FlowChain chain = createVmFlowBuilder.build();

这是创建一个严肃的、可配置的、包含可复用流程的工作流程的典型方式。在上面的例子中,那个工作流的目的是创建用户VM;一个所谓的应用VM具有除分配虚拟机网卡外基本相同的流程,所以appliance
VM的单一的流程配置和用户VM的流程配置大多数是可以共享的:

org.zstack.compute.vm.VmAllocateHostFlow org.zstack.compute.vm.VmImageSelectBackupStorageFlow org.zstack.compute.vm.VmAllocatePrimaryStorageFlow org.zstack.compute.vm.VmAllocateVolumeFlow org.zstack.appliancevm.ApplianceVmAllocateNicFlow org.zstack.compute.vm.VmInstantiateResourcePreFlow org.zstack.compute.vm.VmCreateOnHypervisorFlow org.zstack.compute.vm.VmInstantiateResourcePostFlow zstack:plugin <zstack:extension interface=“org.zstack.header.Component” /> <zstack:extension interface=“org.zstack.header.Service” /> </zstack:plugin>

备注:在之前的图片中,我们把ApplianceVmAllocateNicFlow流程高亮为绿色,这是创建用户VM和应用VM的工作流步骤中唯一不同的地方。

2.编程的方式

一个FlowChain还可以通过编程方式创建。通常当要创建的工作流是琐碎的、流程不可复用的时候,使用这种方法。

FlowChain chain = FlowChainBuilder.newSimpleFlowChain();chain.setName(“test”);chain.setData(new HashMap());chain.then(new Flow() { String name = “flow1”; @Override public void run(FlowTrigger trigger, Map data) { /* do some business / trigger.next(); } @Override public void rollback(FlowTrigger trigger, Map data) { / rollback something / trigger.rollback(); }}).then(new Flow() { String name = “flow2”; @Override public void run(FlowTrigger trigger, Map data) { / do some business / trigger.next(); } @Override public void rollback(FlowTrigger trigger, Map data) { / rollback something / trigger.rollback(); }}).done(new FlowDoneHandler() { @Override public void handle(Map data) { / the workflow has successfully done / }}).error(new FlowErrorHandler() { @Override public void handle(ErrorCode errCode, Map data) { / the workflow has failed with error */ }}).start();

以上形式使用不方便,因为在流中通过一个map data交换数据,每一个流程必须冗余地调用data.get()和data.put()函数。使用一种类似DSL的方式,流可以通过变量共享数据:

FlowChain chain = FlowChainBuilder.newShareFlowChain();chain.setName(“test”);chain.then(new ShareFlow() { String data1 = “data can be defined as class variables”; { data1 = “data can be iintialized in object initializer”; } @Override public void setup() { final String data2 = “data can also be defined in method scope, but it has to be final”; flow(new Flow() { String name = “flow1”; @Override public void run(FlowTrigger trigger, Map data) { data1 = “we can change data here”; String useData2 = data2; /* do something / trigger.next(); } @Override public void rollback(FlowTrigger trigger, Map data) { / do some rollback / trigger.rollback(); } }); flow(new NoRollbackFlow() { String name = “flow2”; @Override public void run(FlowTrigger trigger, Map data) { / data1 is the value of what we have changed in flow1 / String useData1 = data1; / do something / trigger.next(); } }); done(new FlowDoneHandler() { @Override public void handle(Map data) { / the workflow has successfully done */ } }); error(new FlowErrorHandler() { @Override public void handle(ErrorCode errCode, Map data) { /*the workflow has failed with error */ } }); }}).start();

总结

在这篇文章中,我们展示了ZStack的工作流引擎。通过使用它,在错误发生的时候,ZStack在99%的时间里可以很好地保持系统状态一致,注意是99%的时间里,虽然工作流大多数时候是一个不错的处理错误的工具,但仍然有一些情况它不能处理,例如,回滚处理程序运行失败的时候。ZStack还配备了垃圾收集系统,我们将在以后的文章对它进行介绍。

zstack(一)运行及开发环境搭建及说明 本文档用于vStack的开发以及调试方法,以及安装后路径说明 阅读详情

相关推荐

小小研究一下工作流WorkFlow

修房子 在小牧老家农村,小时候总是看到村里有人在修房子。每次看到有人修房子的时候,他就会爬到房子面前的沙粒堆上去,翻找随着沙子一起被挖出来的贝壳。虽然也不知道拿来干嘛,不过总觉得收集贝壳很好玩。 小牧也喜欢看他们修房子。修房子的时候,专业的修房师傅会指导工人如何一步步修房子。第一步,首先要打地基,把地基打的牢牢的。第二步是浇筑地梁。在地基上面浇筑房子的核心骨架。第三步是盖造房子的主体结...

任杰的博客 1765

ZStack源码剖析之核心库鉴赏——FlowChain

本文首发于泊浮目的专栏:https://segmentfault.com/blog... 前言 在ZStack(或者说产品化的IaaS软件)中的任务通常有很长的执行路径,错误可能发生在路径的任意一处。为了保证系统的正确性,需提供一种较为完善的回滚机制——在ZStack中,通过一个工作流引擎,ZStack的每一个步骤都被包裹在独立的工作流...

weixin_34357436的博客 309

ZStack——自动化测试系统1:集成测试

测试,对于一个IaaS软件的可靠性、成熟度和可维护性而言,是一个重要的因素.测试在ZStack中是全自动的。这个自动化测试系统包括了三个部分:集成测试,系统测试,基于模块的测试。其中集成测试构建于Junit之上,使用了模拟器。通过这个集成测试系统提供的各种各样的功能,开发人员可以快速的写出测试用例,用于验证一个新特性或者一个缺陷修复。 概述 这个关键因素,在构建一个可靠的、成熟的和可维护的软件产品...

zstack_org的博客 550

ZStack 5分钟 | 浅谈核心架构设计特点

ZStack是下一代开源的云计算IaaS(基础架构即服务)软件。它主要面向未来的智能数据中心,通过提供灵活完善的APIs来管理包括计算、存储和网络在内的数据中心资源。用户可以利用ZStack快速构建自己的智能云数据中心,也可以在稳定的ZStack之上搭建灵活的云应用场景,例如VDI(虚...

chengtuandao1076的博客 742

zstack(四)zstack架构简介

本篇简单介绍一下zstack的架构设计。现在的zstack加入了一个新的模块woodpecher,用于自动化测试。由于本人对这块没有研究过,这里先不讲这个。

任杰的博客 6248

ZigBee协议栈工作流程与无线LED控制实战——基于ZStack的组网与应用开发

ZigBee或许不是最快的,也不是最新的,但它用极致的稳定、超低的功耗与强大的自组网能力,在物联网世界中牢牢占据一席之地。从一盏智能灯,到整栋楼宇的能源管理系统,它的身影无处不在。而TI的ZStack协议栈,则为我们提供了一个成熟、可靠、可定制的开发平台。只要掌握了其底层机制与开发技巧,就能快速构建出高性能的ZigBee产品。希望这篇文章能帮你揭开ZigBee的神秘面纱,不再只是“配不上网就重启”的用户,而是真正理解它、驾驭它的开发者。🌟如果你正在做相关项目,欢迎留言交流经验!

weixin_42588555的博客 956

ZStack基本工作原理

目录 ZStack基本工作原理 1 摘要 1 前言 2 1、ZStack协议栈介绍 2 1.1、ZStack 2 1.2、ZStack协议栈的架构 2 2、 ZStack协议栈工作 4 2.1、ZStack的实现 4 2.2、ZStack OSAL API 介绍 5 2.3、ZStack的工作函数 6 参考 8 ZStack基本工作原理 摘要 ZStack是下一代开源的云计算IaaS(基础架构即服...

weixin_44808074的博客 1万+

ZStack开发流程

本文档详细描述了zStack中协调器形成网络和节点加入网络的处理过程,对理解zigbee的这一过程有非常大的帮助.

【Zstack】快速掌握简单应用层开发

基于TI样例快速开发Zstack协议栈应用层  本文基于TI GenericApp样例 梳理样例应用层函数,学习协议栈和相关编程思路。 知识储备 C语言基础(包括回调函数、静态变量、指针、结构体以及一些很基础的概念) 初步程序设计思想(过程设计,模块化设计,代码复用,自顶向下) Zstack,OSAL的基本运作机制(轮询机制等概念,有个流程图) 如果对后面文章哪一处有疑问,建议问问神奇...

GoldenSoap的博客 2251

Ymnet2018代码,正式版带工作流

正式版本,带有工作流,修复一下BUG,调整IOC注入方式,自动注入

Z-Stack系统运行流程图

Z-Stack系统运行流程图 ZigBee学习入门利器

ZStack

ZStack的创始人张鑫是早期CloudStack核心开发人员,于2010年加入ZStack Cloud(后来被Citrix 2.3亿美金收购)。在此之前,张鑫是世界最早一批开源虚拟机内核工程师,于2006年加入Intel从事Xen内核开发工作。在云计算领域有近10年工作经验。2015年张鑫从Citrix离职,从硅谷回国后和搭档尤永康(Intel资深经理,2003年加入Intel)创建ZStack,团队成员80%来自Intel、微软、EMC、Citrix等公司,都在相关领域拥有近10年工作经验。

顺其自然~专栏 715

activiti-6.0.0.zip工作流引擎官方包

官网访问不了,越岭找到放在这儿供大家使用。 本来不想要积分的,但是最少要一个

本土IaaS佼佼者,ZStack正式入驻Gitee

​IaaS(Infrastructure-as-a-Service,基础设施即服务)的概念在开发者心中可能不如 SaaS 或 PaaS 那么令人印象深刻,但作为最基础的服务,其重要性并不亚于其他两者。 而 ZStack 就是国内 IaaS 服务中的姣姣者,凭借着其全新的、自研的架构,2015 年上线以来已经为超过 1200 家企业客户提供了云产品和服务。 更难能可贵的是,ZStack 在商业化与开源中找到了平衡,在为企业客户提供服务的同时,其开源的社区版本也收获了超过一万名的用户,并逐步建立了国内最大的

ZicoChan的博客 559

简述Z-Stack的基本工作原理与流程(OSAL操作系统)

首先上图,跟着图中的函数顺序来感受Z-Stack的工作流程: 原创文章 1获赞 1访问量 85 关注 私信 展开阅读全文 作者:晨少hc

数模【Mathematica(安装、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例)】

Mathematica(安装and激活、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例) Mathematica_11.3.0 安装教程 Mathematica11.3 激活 P1 笔记本 P2 入门方法 P3 基本计算 P4 基本图形 P5 创建互动模型 P6 利用数据 P7 演示 P8 完整实例

upward 12万+
上一篇: ZStack--标签系统
下一篇: ZStack--通用插件系统
普通网友
博客等级 码龄10年 769粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值