CDP:Fanoutパターン

提供:AWS-CloudDesignPattern
移動: 案内, 検索

複数種類の処理を非同期かつ並列に実行[関連ブログ 1]

目次

解決したい課題

 あるデータを元に、複数の処理を実行したいケースがある。例えば、画像をアップロードした後に、サムネイル、画像認識、メタデータのスキャンの三つのタスクを実行するなどのケースが該当する。

 このような場合、画像アップロードを検知したアプリケーションからそれぞれの処理を呼び出して逐次処理は可能だが、各処理の時間が長い場合、トータルで非常に長くなる。例えば、画像アップロードをWeb 画面から実行した場合にサーバー側の処理が長ければ、ユーザーエクスペリエンスが悪くなる。 また、処理が増えた場合、例えばモノクロ画像作成のタスクを増やしたいような場合は、呼び出し元のプログラムを改修する必要が出てくる。

クラウドでの解決/パターンの説明

 処理を呼び出すプロセスから直接各処理を呼び出すのではなく、間にノーティフィケーション(通知)コンポーネントとキューイングコンポーネントを入れることで、非同期かつ並列に処理が可能になる。 処理を呼び出すプロセスは、通知先への通知の後に、処理を続行できる。また、通知先の処理については知っている必要がないため、処理を増やしたい場合も通知コンポーネントへの通知先登録を増せば対応できる。 また、キューごとに処理を割り当てて動作させれば、並列に処理を実行できる。

実装

 ノティフィケーションコンポーネントにはAmazon Simple Notification Service(SNS)、キューイングコンポーネントにはAmazon Simple Queue Service(SQS)を使用できる。

 これらサービスはAWSがマネージしており、冗長化されている上に、利用や運用に手間がかからない。そのためこの二つを利用する。

  • 通知依頼を送るための、Amazon SNSのトピックを作成する。
  • 処理ごとにAmazon SQSのキューを作成する。各キューから、SNSのトピックをサブスクライブしておく。
  • 処理ごとにプログラムを分割し、それぞれSQS のキューをポーリングするようにして、プロセスを起動しておく。
  • 処理が開始されたときに、初めのプロセスがSNSのトピックへ通知を依頼する。
  • SNSはSQSのキューに対し、メッセージを送信する。
  • キューをポーリングしていたプロセスがメッセージを取得し、処理を並列に実行する。

構造

6wNg0ISJczU5Pz1m-A1FCE.png

利点

  • 処理を非同期にすることで、ユーザーエクスペリエンスを改善できる。
  • 並列で処理できるため、処理時間を短縮可能である。
  • 処理を一旦キューに入れることで、単一のプロセスが落ちた場合でもリカバリーが行いやすく、全体として耐障害性が向上する。
  • 各処理が疎結合になるため、処理の追加や、一部処理だけのリソース増強などが行いやすい。

注意点

  • 元々1プロセスで処理するようプログラムが組んである場合、プログラムの改修が必要。
  • すべての処理が終わったかどうかのステータスは、DB などを使用して管理する必要がある。

その他

  • 処理の重複や、処理順番などの制御が必要な場合は、Amazon SWF(Simple Workflow Service)の利用も検討する。

関連ブログ

  1. Amazon Web Services Blog の「SQS Queues and SNS Notifications - Now Best Friends」( http://aws.typepad.com/aws/2012/11/queues-and-notifications-now-best-friends.html )
個人用ツール
名前空間
変種
操作
CDPメニュー
ツールボックス