说明:本文是在亚马逊AWS英文文档的基础上翻译并整理而来。1 Sample Workflow介绍

Sample Workflow是亚马逊AWS提供的一种公共网络服务。

1.1 什么是Sample Workflow

Sample WorkflowSWF)是亚马逊提供的一种云计算服务,它通过一个提供给协调分布式组件的程序设计模式和框架,以及以一种可靠地方式维护他们的执行状态,简化了部署异步和分布式应用程序的复杂度。

亚马逊SWF的架构如下图所示:

亚马逊AWS之Sample Workflow_亚马逊

1.2 为什么需要Sample Workflow

通过使用亚马逊的SWF,您将解放出来专注于构建您的应用程序方面。

1.3 Sample Workflow的一些概念

1.3.1 Workflow

工作流是一种分布式应用程序,它由在不同设备上分布式运行的协调逻辑和任务组成。在设计工作流的过程中,需要对应用程序进行分析,将组件的任务标示出来。在亚马逊SWF中,这些任务被称为activities。工作流的协调逻辑模块来决定哪些activities被执行。

在协调逻辑和activities被设计完成之后,就可以将它们注册为工作流和activities 类型。在注册过程中,需要为每一个类型指定一个名字、一个版本号以及一些默认的配置项。

1.3.2 Workflow History

每一个工作流执行过程都被记录到了工作流历史中,亚马逊SWF负责维护这个工作流历史。工作流历史是一个对工作流启动之后每一个执行的事件的详细、完整、一致的记录。

一个事件是工作流执行状态的间歇性改变,例如:当一个新的activity被计划,或者一个运行的activity执行完成的时候。

不改变工作流执行状态的操作是不会记录到工作流历史中去的。

工作流历史有下面主要的好处:

1.它使应用程序是无状态的,这是因为工作流执行的所有信息都保存到工作流历史中去了;

2.对于每一个工作流执行而言,工作流历史提供了哪些activities被安排了、它们当前的状态是什么以及它们的执行结果。

3.工作流历史提供了一种详细的审计追踪记录,可以用来监控工作流的执行情况,以及验证已经完成的工作流执行。

1.3.3 Actors

Actor可以是工作流的启动者,也可以是deciders,又可以是workers。这些actors通过API与亚马逊SWF交互。

1.3.4 Domains

每一个工作流都是运行在一个domain中的,domain限制了工作流的范围。一个亚马逊AWS账号可以同时拥有多个domain,而每一个domain也可以包含多个工作流,但是不同domain中的工作流是不能够交互的。

 

1.3.5 Object Identifiers

下面这些概念描述了亚马逊SWF中一些对象如何被唯一标示的:

1.WorkflowType:一个注册的工作流类型由其domainnameversion来标示,字段名为RegisterWorkflowType

2.ActivityType:一个注册的activity类型由其domainnameversion来标示,字段名为RegisterActivityType

3.DecisionTask and Activity Task:每一个decision taskactivity task都是由一个task token来标示的,这个task token是由亚马逊SWF来生成的。

4.WorkflowExecutionWorkflow executiondomain、工作流IDrunID来标示;前两个是启动工作流执行(StartWorkflowExecution)的输入参数,run ID是启动工作流执行之后返回的。

 

1.3.6 Task Lists

Task lists提供了一种管理工作流中的tasks的方式,可以简单理解为动态队列。

Task Lists还提供了一种分发task的机制,它是动态存在的,不需要注册也不需要显式的创建,当计划了一个task的时候就会自动创建一个task list(如果这个task list以前不存在的话)。

下面有几种不同类型的Task List

1.DecisionTask Lists:每个工作流执行都被关联到了一个指定的decision task list。当注册一个工作流类型的时候,可以为这个工作流类型的执行指定一个默认的task list

2.ActivityTask Lists:一个单独的activity task list可以包含不同activity类型的task。任务列表中的任务按照顺序计划和分配。

3.TaskRouting:当worker要取一个task的时候,它可以指定一个task list去取任务。如果它这样做了的话,这个worker就只能接收该task list中的任务了。这样一来,就可以确保特定的任务只能分配给特定的workers

 

1.3.7 Timeout Types

为了保证工作流执行能够正确运行,亚马逊SWF提供了一些超时时间类型供设置。一些类型指定工作流全部完成的超时时间,一些指定了任务分配给worker之后要多久才执行,另外一些指定了task被分配到之后要多久能够执行完成。需要注意的是,在SWF中超时时间的单位都是秒。

1.WorkflowStart to Close(类型:START_TO_CLOSE):指定了一个工作流执行的最长时间。工作流注册的时候为这个指定一个默认值,工作流启动之后还可以修改这个值。当达到这个超时时间之后,SWF将会关闭这个工作流执行,并且在工作流历史中增加一个WorkflowExecutionTimedOut类型的事件;

2.DecisionTask Start to Close(类型:START_TO_CLOSE):指定了decider完成一次decision task的最长时间。它是在工作流类型注册时指定的。如果这个超时时间达到的时候,这个task将会在工作流历史中标记为超时(DecisionTaskTimedOut)。

3.ActivityTask Start to Close(类型:START_TO_CLOSE):指定了worker接收到任务之后完成该任务所需要的最大时间。

4.ActivityTask Heartbeat(类型:HEARTBEAT):指定了通过RecordActivityTaskHeartbeat操作提供的进程

5.ActivityTask Schedule to Start(类型:SCHEDULE_TO_START):指定了activity task在没有worker可用来执行的情况下,SWF等待的最大时间。当时间达到的时候,过期的task将不会再分配给另外的worker

6.ActivityTask Schedule to Close(类型:SCHEDULE_TO_CLOSE):指定了activity task在计划之后最长将过多久执行完成。为了最佳实践,这个值不应该大于Activity Task Scheduleto StartActivity Task Start toClose之和。

 

1.3.8 Activity

在设计亚马逊SWF之前,需要首先定义需要的activities,然后将每一个activity注册到SWF中成为一个activity类型。当注册activity的时候,需要提供一些信息,例如:名字和版本,以及activity的过期时间。

需要注意的是,在一个工作流中,同一个activity可能会执行多次,输入也可能是不一样。例如:对于一个客户订单的工作流,处理订购产品的activity就可能会执行多次,这是因为客户可能会同时购买多个产品,此时对于该activity而言只是输入(产品信息)不一样而已。

1.3.9 Tasks

亚马逊SWF中有两种不同的task

1.Activitytask:对一个activity的一次调用,告诉worker去执行它的功能,例如:检查库存、信用卡支付等。activity task包含了worker所需要的执行其功能的所有信息。

2.DecisiontaskDecision task告诉一个decider工作流执行状态已经被改变了,因此decider可以决定下一次需要执行的activity

下图展示了工作流和decider之间的关系:

亚马逊AWS之Sample Workflow_网络服务_02

下图展示了与activity相关的组件之间的关系:

亚马逊AWS之Sample Workflow_网络服务_03

 

1.3.10 Activity Worker

Activity Worker是一个接受、处理activity task的进程或者线程,并且会在处理完成之后返回结果。

对于Activity task以及Activity worker而言,它们都可以同步或者异步运行。它们也可以通过不同地理位置的计算机进行分布执行,或者在同一台计算机上执行。不同的activity worker可以用不同的计算机语言来编写,也可以运行在不同的操作系统之上。

1.3.11 Decider

Decider是对工作流中的协调逻辑模块的软件程序实现。Decider负责分配task并提供输入信息给worker,处理工作流启动之后接收到的事件,并在目标完成之后关闭工作流。

1.3.12 Decision

Decision是指一个或者一组动作,指出了工作流接下来将要执行的步骤。Decisiondecider对工作流的task的反馈。

1.4 Sample Workflow是怎么工作的

SWF的执行步骤如下:

1.编写activity workers来实现工作流中的执行步骤;

2.编写decider来实现工作流中的协调逻辑;

3.在亚马逊SWF中注册activitiesworkflow,这个步骤可以通过编程或者亚马逊控制台来完成;

4.启动activities workersdeciders

5.启动工作流的一个或者多个执行。每一个执行都是独立的,你可以为每一个执行提供不同的输入数据;

6.在亚马逊的控制台上查看工作流的执行情况。你可以过滤或者查看正在运行的以及已完成的execution

2 Sample Workflow使用

2.1 注册并登录亚马逊AWS账号

http://aws.amazon.com/上面注册一个亚马逊AWS的账号,如果已有账号,直接登录即可。

2.2 操作亚马逊SWF控制台

SWF控制台上,您可以作如下操作:

1.注册工作流domain

2.注册工作流类型;

3.注册activity类型;

4.初始化工作流执行(Workflow Execution);

5.查看被挂起任务的信息;

6.查看正在运行的工作流执行;

7.取消、终止或者发信号给工作流执行;

8.重启已关闭的工作流执行。

 

2.2.1 SWF控制台长什么样

登陆进入SWF控制台之后,会出现下面的页面:

亚马逊AWS之Sample Workflow_activities_04

 

当至少注册了一个domain之后,将会出现包含全部功能的SWF控制台页面:

亚马逊AWS之Sample Workflow_网络服务_05

2.2.2 注册Domain类型

如果尚未注册一个domain,则点击注册一个新domain”,如果已经注册了,可以在管理domain”里面点击注册新domain”

注册domain的时候,需要填写名字、工作流执行保留周期时间以及描述信息等,如下图所示:

亚马逊AWS之Sample Workflow_亚马逊_06

Domain注册成功之后,会弹出一个管理domain的对话框:

亚马逊AWS之Sample Workflow_云计算_07

 

2.2.3 注册工作流类型

注册工作流类型的时候,需要输入如下信息:domain、工作流名字、工作流版本号、默认的任务列表、工作流执行的默认运行时间、任务的默认运行时间等。

亚马逊AWS之Sample Workflow_网络服务_08

点击“Continue”之后,会出现附加信息的对话框:

 亚马逊AWS之Sample Workflow_网络服务_09

接下来会查看填写的信息,确认无误之后就可以点击注册了:

亚马逊AWS之Sample Workflow_亚马逊_10

 

2.2.4 注册Activity类型

注册Activity类型的时候,需要填写如下信息:Domainactivity名字、activity版本号、任务列表、任务从计划到启动的超时时间、任务启动之后到结束的超时时间等。

亚马逊AWS之Sample Workflow_亚马逊_11

 

点击“Continue”之后,会出现附加信息的对话框:

亚马逊AWS之Sample Workflow_云计算_12

接下来会查看填写的信息,确认无误之后就可以点击注册了:

亚马逊AWS之Sample Workflow_应用程序_13

 

2.2.5 启动一个工作流执行

启动工作流执行的时候,需要填写如下信息:domain、工作流名字、工作流版本号、工作流ID、任务列表、工作流执行的最大运行时间、任务从启动到结束的超时时间等。

亚马逊AWS之Sample Workflow_亚马逊_14

点击“Continue”之后,会出现附加信息的对话框:

亚马逊AWS之Sample Workflow_云计算_15

接下来会查看填写的信息,确认无误之后就可以点击注册了:

亚马逊AWS之Sample Workflow_网络服务_16

 

2.2.6 查看挂起任务的信息

选择任务列表的类型,然后输入任务列表名,就可以查询了:

亚马逊AWS之Sample Workflow_activities_17

2.2.7 管理工作流执行

输入工作流ID,查询该工作流下面的执行:

亚马逊AWS之Sample Workflow_activities_18

接下来会出现工作流执行的列表,并且可以选择条件进行过滤:

亚马逊AWS之Sample Workflow_云计算_19

对这些工作流执行,可以作如下的操作:

1.对工作流执行发信号,实际上就是对一个正在运行中的工作流执行发送一些附加的数据:

亚马逊AWS之Sample Workflow_应用程序_20

2.取消工作流执行:

亚马逊AWS之Sample Workflow_activities_21

3.终止工作流执行:

亚马逊AWS之Sample Workflow_亚马逊_22

4.重启一个已关闭的工作流执行:

亚马逊AWS之Sample Workflow_亚马逊_23

勾选一个工作流执行,点击上面的重启按钮,然后按照提示进行操作即可。