[AWS][SWF] AWS SWF(Simple Workflow Service)をNode.jsで試してみた

By |1月 10, 2014|AWS, Javascript, Node.js, |


あけましておめでとうございます。本年もよろしくお願いします。

さて、年末から分散するシステム(コンポーネント)の連携処理を綺麗に管理する方法を模索してまして、今回はAWSのSWF(Simple Workflow Service)を試してみます。

多分、実装より概念を理解する方が大変だと思いますがクラスメソッドさんのAmazon Simple Workflow Service (SWF) 入門が詳しいので御覧ください。

すごく乱暴に言うとdeciderとworkerがSWFを介してタスクのキャッチボールをしてるような感じです。

  1. starterによって処理がスタートされる
  2. deciderによって任意のworkerへ処理が割り振られる
  3. workerは割り振られた処理を実行しSWFへ完了通知
  4. deciderは続く処理がないか判断し処理がなければ処理終了

サンプルを動かした方が理解が早いと思います。JavaとRubyのサンプルで試してみてください。

最後に、この記事ではNode.jsでSWFを利用する方法を掲載します。

AWSからNode.js用のSDKが公開されていてSWFも利用可能ですがラッパーのaws-swfというライブラリがnpmで公開されています。

※2014年1月20日 追記: 現在npmでのバージョンとの差異があります。Github側のファイルを落として動作させると問題なく動作することを確認しました。
まずはサンプルアプリ用のディレクトリを作成してnpmをインストールします。

[html]
$ mkdir sample-swf
$ cd sample-swf
$ npm install aws-swf
[/html]

次に.aws-swf.jsonファイルを作成して以下のようにAWSへのアクセスキーなどを設定します。

次に以下のようにregister.jsを作成します。これはSWFを動かす上で必ず必要な「ドメイン」などの概念を作成するスクリプトです(ここで作成するテスト用ドメインは無効にできますが削除はできませんのでお気をつけください)

次に以下のようにworkflow_starter.jsを作成します。これはワークフローを作成しスタートさせるスクリプトです。

次に以下のようにdecider.jsを作成します。これはworkerへ処理を割り振ったり処理を終了させるためのスクリプトです。割り振るケースが増えれば自ずとコード量は増えますが基本的に構成は大きく変わりません。

次に以下のようにactivity_worker.jsを作成します。これはworkerに割り振られた処理を実行しSWFへ完了通知するスクリプトです。このサンプルでは何もしていませんが本来はビジネスロジックが実行されるスクリプトです。

すべてのファイルを用意しましたら、まずドメインやワークフロータイプ、アクティビティタイプを登録するregister.jsを実行します。これは必ず最初に行う必要があり作成後は勿論2度と実行する必要はありません。

[html]
$ node register.js
[/html]

実行するとAWS SWFの管理コンソールに作成したドメインとワークフロータイプ、アクティビティタイプが表示されているのを確認しましょう。

ドメインなどの登録が済めばdeciderとworkerを起動してポーリングしておけますのでdeciderとworkerを起動しておきます(コンソールウィンドウを分ければ複数起動可能です)

[html]
$ node decider.js
[/html]

[html]
$ node activity_worker.js
[/html]

最後に以下のようにしてワークフローをスタートさせましょう。

[html]
$ node workflow_starter.js
[/html]

するとdeciderやworkerのログが進みキャッチボールしてる感じが表示されます。何も実際の処理をしていないのであっという間に処理が完了してしまいますが管理コンソールで履歴を確認することで動きを理解できます。

左Navigationの「Workflow Executions」をクリックして「Execution Status」を「Closed」にして「List Executions」ボタンを押しますと終了したワークフローが表示されますので先ほど実行されたワークフロー(workflow_starter.jsでのワークフロースタート時にログに表示されたRun IDで判断しましょう)のWorkflow Execution IDをクリックします。

ワークフローの詳細を開きましたら「Events」タブや「Activities」タブを開いてみます。Eventsにてワークフローイベントの履歴を確認し最上の「Event Type」が「WorkflowExecutionCompleted」になっていれば処理はちゃんと完了しています。また、ActivitiedにてActivityが表示され「Status」が「Complete」になっていればビジネスロジックも完了しています。

これで漠然と動きは把握できるかと思います。あとは実際のロジックに組み込んでいく中で完全に理解できるかと思います。