天天看點

工作流 —— AWS

1 Sample Workflow介紹

Sample Workflow是亞馬遜AWS提供的一種公共網絡服務。

1.1 什麼是Sample Workflow

Sample Workflow(SWF)是亞馬遜提供的一種雲計算服務,它通過一個提供給協調分布式元件的程式設計模式和架構,以及以一種可靠地方式維護他們的執行狀态,簡化了部署異步和分布式應用程式的複雜度。

亞馬遜SWF的架構如下圖所示:

工作流 —— AWS

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:一個注冊的工作流類型由其domain、name、version來标示,字段名為RegisterWorkflowType;

2.ActivityType:一個注冊的activity類型由其domain、name、version來标示,字段名為RegisterActivityType;

3.DecisionTask and Activity Task:每一個decision task和activity task都是由一個task token來标示的,這個task token是由亞馬遜SWF來生成的。

4.WorkflowExecution:Workflow execution由domain、工作流ID和runID來标示;前兩個是啟動工作流執行(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 Start和Activity 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.Decisiontask:Decision task告訴一個decider工作流執行狀态已經被改變了,是以decider可以決定下一次需要執行的activity。

下圖展示了工作流和decider之間的關系:

​​

工作流 —— AWS

下圖展示了與activity相關的元件之間的關系:

工作流 —— AWS

1.3.10 Activity Worker

Activity Worker是一個接受、處理activity task的程序或者線程,并且會在處理完成之後傳回結果。

對于Activity task以及Activity worker而言,它們都可以同步或者異步運作。它們也可以通過不同地理位置的計算機進行分布執行,或者在同一台計算機上執行。不同的activity worker可以用不同的計算機語言來編寫,也可以運作在不同的作業系統之上。

1.3.11 Decider

Decider是對工作流中的協調邏輯子產品的軟體程式實作。Decider負責配置設定task并提供輸入資訊給worker,處理工作流啟動之後接收到的事件,并在目标完成之後關閉工作流。

1.4 Sample Workflow是怎麼工作的

SWF的執行步驟如下:

1.編寫activity workers來實作工作流中的執行步驟;

2.編寫decider來實作工作流中的協調邏輯;

3.在亞馬遜SWF中注冊activities和workflow,這個步驟可以通過程式設計或者亞馬遜控制台來完成;

4.啟動activities workers和deciders;

5.啟動工作流的一個或者多個執行。每一個執行都是獨立的,你可以為每一個執行提供不同的輸入資料;

6.在亞馬遜的控制台上檢視工作流的執行情況。你可以過濾或者檢視正在運作的以及已完成的execution。