Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【ZStack】6.工作流引擎

【ZStack】6.工作流引擎

作者头像
泊浮目
发布于 2024-01-09 05:36:14
发布于 2024-01-09 05:36:14
19000
代码可运行
举报
文章被收录于专栏:狗哥的专栏狗哥的专栏
运行总次数:0
代码可运行

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接口,可以包含子流程,并只在前面所有流程完成后才可以执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中以被创建。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="VmInstanceManager" class="org.zstack.compute.vm.VmInstanceManagerImpl">
    <property name="createVmWorkFlowElements">
        <list>
            <value>org.zstack.compute.vm.VmAllocateHostFlow</value>
            <value>org.zstack.compute.vm.VmImageSelectBackupStorageFlow</value>
            <value>org.zstack.compute.vm.VmAllocatePrimaryStorageFlow</value>
            <value>org.zstack.compute.vm.VmAllocateVolumeFlow</value>
            <value>org.zstack.compute.vm.VmAllocateNicFlow</value>
            <value>org.zstack.compute.vm.VmInstantiateResourcePreFlow</value>
            <value>org.zstack.compute.vm.VmCreateOnHypervisorFlow</value>
            <value>org.zstack.compute.vm.VmInstantiateResourcePostFlow</value>
        </list>
    </property>

    <!--only a part of configuration is showed -->
</bean>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FlowChainBuilder createVmFlowBuilder = FlowChainBuilder.newBuilder().setFlowClassNames(createVmWorkFlowElements).construct();
FlowChain chain = createVmFlowBuilder.build();

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="ApplianceVmFacade"
    class="org.zstack.appliancevm.ApplianceVmFacadeImpl">
    <property name="createApplianceVmWorkFlow">
        <list>
            <value>org.zstack.compute.vm.VmAllocateHostFlow</value>
            <value>org.zstack.compute.vm.VmImageSelectBackupStorageFlow</value>
            <value>org.zstack.compute.vm.VmAllocatePrimaryStorageFlow</value>
            <value>org.zstack.compute.vm.VmAllocateVolumeFlow</value>
            <value>org.zstack.appliancevm.ApplianceVmAllocateNicFlow</value>
            <value>org.zstack.compute.vm.VmInstantiateResourcePreFlow</value>
            <value>org.zstack.compute.vm.VmCreateOnHypervisorFlow</value>
            <value>org.zstack.compute.vm.VmInstantiateResourcePostFlow</value>
        </list>
    </property>

    <zstack:plugin>
        <zstack:extension interface="org.zstack.header.Component" />
        <zstack:extension interface="org.zstack.header.Service" />
    </zstack:plugin>
</bean>

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

2.编程的方式

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的方式,流可以通过变量共享数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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还配备了垃圾收集系统,我们将在以后的文章对它进行介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ZStack--工作流引擎
在IaaS软件中的任务通常有很长的执行路径,一个错误可能发生在任意一个给定的步骤。为了保持系统的完整性,一个IaaS软件必须提供一套机制用于回滚先前的操作步骤。通过一个工作流引擎,ZStack的每一个步骤,包裹在独立的工作流中,可以在出错的时候回滚。此外,通过在配置文件中组装工作流的方式,关键的执行路径可以被配置,这使得架构的耦合度进一步降低。
用户2040787
2018/05/06
1.6K3
ZStack--工作流引擎
ZStack源码剖析之核心库鉴赏——FlowChain|Java 开发实战
在ZStack(或者说产品化的IaaS软件)中的任务通常有很长的执行路径,错误可能发生在路径的任意一处。为了保证系统的正确性,需提供一种较为完善的回滚机制——在ZStack中,通过一个工作流引擎,ZStack的每一个步骤都被包裹在独立的工作流中,可以在出错的时候回滚。此外,通过在配置文件中组装工作流的方式,关键的执行路径可以被配置,这使得架构的耦合度进一步降低。
泊浮目
2024/01/09
2600
【ZStack】3.ZStack的伸缩性秘密武器:无锁架构
在IaaS(Infrastructure as a Service,即基础设施即服务)软件里许多任务要顺序的执行;例如,当一个起动虚拟机的任务正在运行时,一个结束些虚拟机的任务则必有等待之前的开始任务结束才行。另一方面,一些任务以需要并发的同时运行;例如,在同一主机上20个创建虚拟机的任务能同时运行。同步和并行在一个分布式系统中是不好控的并且常常需要一个同步软件。针对这个挑战,ZStack提供了一个基于队列的无锁架构,允许任务很容易的来控制它们的并行级别,从一个同步到N个并行都行。
泊浮目
2024/01/09
1920
【ZStack】3.ZStack的伸缩性秘密武器:无锁架构
【ZStack】5.通用插件系统
当前IaaS软件更像云控制器软件,要成为一个完整的云解决方案还缺少很多特性(features)。作为一个正在发展中的技术,预测一个完整的解决方案的必备的所有特性是非常困难的,所以一个IaaS软件不可能在一开始就完成它所有的特性。基于以上事实,一个IaaS软件的架构必须有能力,在添加新特性的同时保持核心结构稳定。ZStack的通用插件系统,使得特性可以像插件一样实现(在线程内或在线程外),这样不只能使ZStack的功能得到了拓展,也可以注入业务逻辑内部去改变默认的行为。
泊浮目
2024/01/09
1810
【ZStack】5.通用插件系统
Activiti7工作流引擎-什么是Activiti7
Alfresco 软件在 2010 年 5 月 17 日宣布 Activiti 业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理 BPM 的专家 Tom Baeyens 担任,Tom Baeyens 就是原来 jbpm 的架构师,而 jbpm 是一个非常有名的工作流引擎,当然 activiti 也是一个工作流引擎。
cwl_java
2019/12/30
1.4K0
Activiti7工作流引擎-什么是Activiti7
开源工作流引擎 Workflow Core 的研究和使用教程
Workflow Core 中,用于构建工作流的类继承 IWorkflow,代表一条有任务规则的工作流,可以表示工作流任务的开始或者 Do() 方法,或工作流分支获取其它方法。
痴者工良
2019/08/10
8.5K4
ZStack源码剖析之核心库鉴赏——ThreadFacade|Java 开发实战
在ZStack中,最基本的执行单位不仅仅是一个函数,也可以是一个任务(Task。其本质实现了Java的Callable接口)。通过大小合理的线程池调度来并行的消费这些任务,使ZStack这个Iaas软件有条不紊运行在大型的数据中心里。
泊浮目
2024/01/09
1620
ZStack源码剖析之核心库鉴赏——ThreadFacade|Java 开发实战
一个适合于.NET Core的超轻量级工作流引擎:Workflow-Core
  近期工作上有一个工作流的开发需求,自己基于面向对象和职责链模式捣鼓了一套小框架,后来在github上发现一个轻量级的工作流引擎轮子:Workflow-Core,看完其wiki之后决定放弃之前自己造的轮子,使用这个开源项目来改造,也就有了这一篇博文。
Edison Zhou
2019/07/17
6.4K0
一个适合于.NET Core的超轻量级工作流引擎:Workflow-Core
工作流引擎架构设计
最近开发的安全管理平台新增了很多工单申请流程需求,比如加白申请,开通申请等等。最开始的两个需求,为了方便,也没多想,就直接开发了对应的业务代码。
AlwaysBeta
2023/01/12
3.3K0
几大工作流引擎对比图_工作流引擎框架
纵观jBPM:从jBPM3到jBPM5以及Activiti5:http://www.infoq.com/cn/articles/rh-jbpm5-activiti5#
全栈程序员站长
2022/09/20
1.9K0
工作流引擎 Activiti 万字详细入门
工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
全栈程序员站长
2022/09/08
3.5K0
工作流引擎 Activiti 万字详细入门
ZStack 的伸缩性秘密(一)异步架构
ZStack 核心架构设计使得 99% 的任务异步执行,因此确保了单个的管理节点能够管理十万级的物理服务器,百万级的虚拟机,数万级的并行任务。
用户1263954
2018/08/16
6880
ZStack 的伸缩性秘密(一)异步架构
activiti6.0工作流引擎深度解析_自定义工作流引擎
工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
全栈程序员站长
2022/09/27
3K0
activiti6.0工作流引擎深度解析_自定义工作流引擎
【愚公系列】2023年02月 .NET CORE工具案例-Workflow-Core轻量级工作流引擎(数据流转)
流程管理起源于生产组织和办公自动化领域,是针对日常工作中具有固定程序的活动提出的一个概念。目的是通过将工作分解成定义良好的任务、角色,按照一定的规则和过程来执行这些任务并对它们进行监控,达到提高办事效率、降低生产成本、提高企业生产经营管理水平和企业竞争力的目标。
愚公搬代码
2023/03/16
8900
【愚公系列】2023年02月 .NET CORE工具案例-Workflow-Core轻量级工作流引擎(数据流转)
【愚公系列】2023年02月 .NET CORE工具案例-Workflow-Core轻量级工作流引擎(随机流程)
流程管理起源于生产组织和办公自动化领域,是针对日常工作中具有固定程序的活动提出的一个概念。目的是通过将工作分解成定义良好的任务、角色,按照一定的规则和过程来执行这些任务并对它们进行监控,达到提高办事效率、降低生产成本、提高企业生产经营管理水平和企业竞争力的目标。
愚公搬代码
2023/03/16
7890
【愚公系列】2023年02月 .NET CORE工具案例-Workflow-Core轻量级工作流引擎(随机流程)
Activity工作流引擎学习笔记(一)「建议收藏」
工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
全栈程序员站长
2022/09/08
1.6K0
Activity工作流引擎学习笔记(一)「建议收藏」
Activiti7工作流引擎-什么是工作流
工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
cwl_java
2019/12/30
1.1K0
Activiti7工作流引擎-什么是工作流
工作流引擎在vivo营销自动化中的应用实践 | 引擎篇03
本文是《vivo营销自动化技术解密》的第4篇文章,分析了在营销自动化业务引入工作流技术的背景和工作流引擎的介绍,同时介绍了几种业界流行的开源工作流引擎特点,以及在项目自研开发过程中的设计思路和总结思考。
2020labs小助手
2022/07/18
1.6K0
工作流引擎之activiti入门
在解释activiti之前我们看一下什么是工作流。 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。 我的理解是,工作流将一套大的业务逻辑分解成业务逻辑段, 并统一控制这些业务逻辑段的执行条件,执行顺序以及相互通信。 实现业务逻辑的分解和解耦。 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。 BPMN即业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)。
lyb-geek
2018/07/26
9.3K0
工作流引擎之activiti入门
【愚公系列】2023年02月 .NET CORE工具案例-Workflow-Core轻量级工作流引擎(流程事件)
流程管理起源于生产组织和办公自动化领域,是针对日常工作中具有固定程序的活动提出的一个概念。目的是通过将工作分解成定义良好的任务、角色,按照一定的规则和过程来执行这些任务并对它们进行监控,达到提高办事效率、降低生产成本、提高企业生产经营管理水平和企业竞争力的目标。
愚公搬代码
2023/03/16
6810
【愚公系列】2023年02月 .NET CORE工具案例-Workflow-Core轻量级工作流引擎(流程事件)
推荐阅读
相关推荐
ZStack--工作流引擎
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验