以下メモ

aaaaa

[WIP]後日、画像追加

Amazon Simple Workflow Service (SWF)

(なんでSWSじゃないんだろう)

Amazon SWFは「処理のステート管理」と「タスク間のコーディネート」を行うためのフルマネージドサービス。分散するアプリケーションコンポーネントにまたがる作業のコーディネートを目的とする。

Amazon SWFによって、システム構築における以下の問題を解消できる。

  • スケーラビリティ
  • アベイラビリティ
  • 並列処理の制御
  • ネットワーク/FW越しの連携

Amazon SWFを利用すると、広範囲にわたるユースケース、たとえばメディア処理、ウェブアプリケーションのバックエンド、ビジネスプロセスワークフロー、分析パイプラインなどのアプリケーションを、複数のタスクを連携させたものとして設計することが可能になる。

ワークフローって?

仕事(ワークアイテム)を複数のサブシステム(worker)が連携しながら処理していくシステムを、ワークフローと呼ぶ。 注文を受け、確認メールを送り、在庫を確保し、カード決済をして、伝票を印刷して…。その最も単純な形は、一直線のフローを各workerが逐次処理する「流れ作業」になる。

しかし、一直線の単純なフローはほとんど存在しない。workerによる処理の失敗やタイムアウト、リトライ、または別ルートによるリカバリーのフローへの切り替えなど、思いつく限りでも例外は沢山存在する。 そして、このような仕組みの上で、各々のworkerによる処理はいつ、どのように実行されたのか、いつ失敗したのか、などを全て追跡できる必要がある。

その他にも、大量のワークアイテムが発生したときに備えてのスケーラビリティも求められており、並列処理やworkerのノード数の増減も行えなくてはならない。

こういった必要な例外を全て処理する準備があり、ワークフローシステムをスケーラブルに実装する基盤が、Amazon SWFだ。

簡単なSWFの説明

例えば、ユーザからアップロードされた動画を処理するアプリ場合、そのフローには「元動画の保存」「エンコード処理」「サムネイル作成」などのタスクが生じる。 利用者はそれぞれをステートレスなタスク(値を保持しないタスク)として記述して登録しておくことで、SWFがステート管理、タスクのキューイング、エラーの補足など、汎用的な処理を全て行ってくれる。(つまり、タスクのコントローラとなってうまくコーディネートしてくれる)

SWFはタスクの処理内容にまでには関与しない。あくまでもタスクの流れ(デサイダー)と、タスクの行動(アクティビティ)を整理し、コーディネートとステート管理を行うサービスであり、キューに入ってくる実行履歴をもとに次のタスクを決めるところだけに専念する。

SWFの登場人物

ワークフロースターター

SWFアーキテクチャはまずワークフロースターターと呼ばれる、ワークフローを発火する処理をキックするところから始まる。これは例えば「ユーザが動画をアップロード」などでキックあったり、ウェブサービスからの呼び出し、スクリプトやコンソールからキックすることも可能。

これをキックするたび、ワークフローエグゼキューションが作成される。

ワークフローエグゼキューション

ワークフローのインスタンスであり、ワークフローでの作業に必要な項目を保持する役割がある。また、これ自体はインスタンスであるため、ワークフロースターターを複数回キックすれば複数個実行することも可能。

ここで作成した1つのインスタンスは、タスクリスト(後述)とまとめてドメインと呼ばれるネームスペースに分割して管理される。このドメイン内の機能によって、ステート管理とコーディネートが実現される。

各ワークフローエグゼキューションは、例えば以下のような情報を保持する。

  • WorkflowID: ユーザ採番の任意ID
  • 決算番号や請求書番号など、自由な値を設定できる(重複はエラー)
  • RunID: 自動生成されるユニークなID
  • ワークフローヒストリー: 入出力情報含むタスクの実行履歴
  • 開始時間
  • タイムアウト設定

タスクリスト

タスクの流れ(デサイダー)と、タスクの行動(アクティビティ)を管理するためのタスクリストというものが存在する。デサイダーアクティビティは、それぞれのタスクリスト(デシジョンタスクリスト/アクティビティタスクリスト)をロングポーリングしており、リストに項目があった時はそれを取得してアクションを起こす。

タスクリストの実態はキュー(Amazon SQS)であり、タスクリストに入った1つのタスクは、1つのデサイダー/アクティビティからしか取得できないことを保証している。(可視性タイムアウト)

デサイダー

次のタスクを決めるタスク。 デサイダーはデシジョンタスクリストをポーリングしていて、タスクがあった場合にワークフローエグゼキューションを受け取る。それに含まれる「入力データ」や「ワークフローヒストリー」に従って、次に実行するアクティビティを決定、その結果をAmazon SWFに通知する。

ワーカーとアクティビティ

ワークフロー内の実際の処理。 ワーカーはアクティビティタスクリストをポーリングしていて、タスクがあった場合にワークフローエグゼキューションを受け取る。それに含まれる「入力データ」や「ワークフローヒストリー」に従って、指定のアクティビティを実行、その結果をAmazon SWFに通知する。

アクティビティはワークフロー内の実際のタスク処理であり、ここには「元動画の保存」「エンコード処理」などが含まれる。アクティビティは必ずワーカーと紐付いており、実行はワーカーによって行われ、結果はワーカーを通ってSWFに通知される。

このアクティビティには「フォームに項目を入力して送信」などの人力を介する処理でもOK。また、アクティビティの処理にはAmazon Lambdaを利用できる。

具体的な流れ

準備

Amazon SWFはただのワークフローシステムを実装するための基盤であるため、そのままでは利用できない。そのため、フローに必要なタスクの処理をすべて自分で実装する必要がある。

SWFを利用するためには、まずアプリケーションやワークフローの設計、必要なアクティビティの洗い出しを行い、アクティビティの実装、デサイダーの実装、ワークフローステータスの実装などを全て行わなくてはならない。(これには、AWSが提供しているAWS Flow Frameworkが利用できる)

SWFを始める前に、デサイダーとワーカー(アクティビティ)は、worker.start()などしてAmazon SWF上のタスクリストをポーリングしておく必要がある。

実行

  1. (利用者) ワークフロースターターによるワークフローのキック それに伴い、Amazon SWF内にワークフローのインスタンス、ワークフローエグゼキューションが作成される。

これがワークフローのスタートであり、利用者のキックなどによって発火する。


  1. (SWF) デシジョンタスクリストにタスクを追加

  2. (SWF) デサイダーにワークフローエグゼキューションを返し、次にすべきことを問い合わせる デサイダーはデシジョンタスクリストをロングポーリングしているため、SWFはポーリングの応答としてワークフローエグゼキューションを返すことが出来る。

  3. (デサイダー) 次に実行するべきアクティビティを決定し、SWFに通知する デサイダーはワークフローエグゼキューションを受け取った後、それに含まれる「入力データ」や「ワークフローヒストリー」に従って、次に実行するアクティビティを決定する。例えば、「次はactivity[エンコード処理]を実行」などを決定して通知する。

  4. (デサイダー) 再びSWFに対してロングポーリングを張り、次のデシジョンタスクに備える

ここまでの、「SWFがタスクを取得してデサイダーに送信、デサイダーは内容を分析して結果をSWFに送信」の一連の流れをデシジョンタスクと呼ぶ。


  1. (SWF) デサイダーからの通知をワークフローエグゼキューションのワークフローヒストリーに追記し、アクティビティタスクリストに次のタスクを追加

  2. (SWF) ワーカーにワークフローエグゼキューションを返し、結果を問い合わせる ワーカーはアクティビティタスクリストをロングポーリングしているため、SWFはポーリングの応答としてワークフローエグゼキューションを返すことが出来る。

  3. (ワーカー) 通知に従ってアクティビティを実行し、SWFに通知する ワーカーはワークフローエグゼキューションを受け取った後、それに含まれる「入力データ」や「ワークフローヒストリー」に従って、アクティビティを実行する。例えば、「activity[エンコード処理]」などを実行して結果を通知する。

  4. (ワーカー) 再びSWFに対してロングポーリングを張り、次のアクティビティタスクに備える

ここまでの、「SWFがタスクを取得してワーカーに送信、ワーカーは内容を分析してアクティビティを実行し、結果をSWFに送信」の一連の流れをアクティビティタスクと呼ぶ。


以下、終了時の流れ

  1. (SWF) ワーカーからの通知をワークフローエグゼキューションのワークフローヒストリーに追記し、デシジョンタスクリストに次のタスクを追加

  2. (SWF) デサイダーにワークフローエグゼキューションを返し、次にすべきことを問い合わせる

  3. 最終的にデサイダーが「次実行するactivityは無い」という決定をすることで、ワークフローが完了する

まとめ

タスクに値を保持しない、ステートレス処理をつなげるためのインフラでした! (1つのワークフローなので、理解に時間がかかる、、)

参考

https://aws.amazon.com/jp/documentation/swf/

results matching ""

    No results matching ""