Amazon Simple Workflow Service(SWF)について纏めます。
#1. SWFとは
- ワークフローを構築・実行するためのサービス。
ある処理を実行し、その結果から次に実行する処理を選択する。
この繰り返しで主にバックグラウンド系のタスクを実行する。
#2. SWFの特徴
-
特定のサーバ・クラウド・オンプレに縛られることなく構成できる。
処理を複数のサーバに分散させたり重要なデータを扱う部分のみオンプレで構成することが可能。 -
途中でユーザによる入力が可能。
例えば、次に実行する処理を自動的に選択することが難しかったり、次の処理に進むには上長の承認が必要な場合、処理を停止して入力を待つことが可能。
#3. SWFを構成する要素
###①ワークフロースターター
SWFを起動し、ワークフロー開始の起点となるアプリケーション。
例えば、顧客の注文を起点に動作するワークフローだと注文を受けるアプリケーションがワークフロースターターになる。
###②SWF
ワークフロースターター、もしくはワーカー・Lambdaタスクから受け取った情報を元に決定タスクを作成し、ディサイダーへ渡す。
ディサイダーから受け取った次に実行するタスクの情報からタスクの実行命令を出す。
- 決定タスク
ワークフローの実行状態を伝えるもの。
ワークフロー履歴等を保持する。- ワークフロー履歴
ワークフローが実行されてから発生したイベントの実行記録。
各タスクが実行状態を持たずに決定タスクに持たせることでワークフロースターターやタスクなどのアプリケーションをステートレスに保つことが可能。
- ワークフロー履歴
###③ディサイダー
SWFから受け取った決定タスクを元に次に実行するタスクを決定する。
SWFを使用するユーザ自信がプログラミングして作成する必要があります。
###④タスク
SWFから呼び出されて実行される処理。
アクティビティタスクとLambdaタスクに分類される
- アクティビティタスク
ユーザが作成した任意のプログラム・処理を実行するタスク。
SWFから直接実行されるのではなく、ワーカーと呼ばれるプロセス・スレッドから実行される。
ワーカーは SWFを使用するユーザ自信がプログラミングして作成する必要があります。 - Lambdaタスク
アクティビティタスクと似ているが、AWS Lambdaで作成された処理。
ワーカーは不要。
#4. 使用例
処理の流れを例を用いて整理します
今回はアクティビティタスクA、B、Cが存在し、AとBは同時に実行してAB両方の処理が終了すればCを動かす
と仮定します。
- ワークフロースターターからSWFが呼び出される。
- SWFは決定タスクを作成し、ディザスターに渡す。
この時点で決定タスクが持つワークフロー履歴はABCすべて未実施。 - ディザスターは処理ABCが未実施であることからワークフローが開始したところだと判断し、AとBを実行するようにSWFに返答します。
- SWFはその返答を受けてAとBを実行するワーカーに命令を出します。
- 各ワーカーそれぞれA、Bの処理を実行し始めます。
- [Aの処理が完了]AのワーカーはSWFにその結果を返します。
- SWFは決定タスクを作成してディザスターに渡します。
この時点でワークフロー履歴は
A:完了
B:実行中
C;未実施
となっているはずです。 - ディザスターはBがまだ完了していないことからしばらく待機するようにSWFに返します。
- [Bの処理が完了]Bのワーカーはその結果をSWFに返します。
- SWFは決定タスクを作成してディザスターに渡します。
この時点でのワークフロー履歴は
A:完了
B:完了
C:未実施
となっているはずです。 - ディザスターはABが完了していることからCの処理を実行すべきと判断し、SWFに返答します。
- SWFはCのワーカーに処理実行の命令を出します。
- [Cの処理が完了]CのワーカーはSWFにその結果を渡します。
- SWFは決定タスクを作成してディザスターに渡します。
この時点でのワークフロー履歴は
A:完了
B:完了
C:完了
となっているはずです。 - ディザスターは全ての処理が完了していることからワークフローのすべての処理が完了したことをSWFに連携します。
- SWFが終了し、処理完了です。