CDP:Queuing Chainパターン

From AWS-CloudDesignPattern
Jump to: navigation, search

システムの疎結合化

Contents

解決したい課題

複数のシステムで処理を連携させて逐次的な処理を行う場合(例えば、画像処理の場合、画像のアップロード、保存、エンコーディング、サムネイル作成、などの逐次作業が考えられる)、そのシステム同士が密に結合されていると、逐次処理になるためパフォーマンスのボトルネックが出現しやすい。また、障害時の復旧作業が非常に煩雑になってしまう。できるだけシステムを疎結合にすることがパフォーマンスやメンテナンスの面でも好ましい。

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

システムを疎結合にする方法の1つとして、システム間をキューでつなぎ、仕事(ジョブ)の受け渡しをメッセージの送受信で行うことで、非同期化を実現できる。この場合、メッセージをとって処理をする仮想サーバの数を増やして並列処理を行うこともできるため、ボトルネックを解消しやすい。また、処理を行う仮想サーバに障害が発生しても、未処理のメッセージはキューに残っているため、仮想サーバが復旧次第、処理を容易に再開することも可能となる。

Queuing Chain自体はオンプレミスや仮想化環境でも行う事は出来たが、キュー自体がクラウドサービスとして提供され、仮想サーバを瞬時に柔軟に調達可能であるクラウドの特性により、以前よりも格段に行いやすくなっている。従って改めてCDPの1つとして挙げる事とした。

実装

Amazon SQSを用いるとキューのミドルウェアを運用することなく、必要なときに必要なだけ安価な価格でキューサービスを用いることができる。キューにジョブを出し入れするプロセスを走らせるのにEC2を用いた例を下記に示す。

  • ある処理を担当するEC2インスタンスから、次の処理を担当するEC2インスタンスへの処理の受け渡しはSQSを仲介して行う。
  • EC2上でのジョブ処理は下記のように行われる。
  • ジョブ(メッセージ)の受信 → ジョブの処理 → ジョブ(メッセージ)の送信
  • 仮想サーバはジョブの性質により複数稼働させることも可能。

構造

6wNg0ISJczU5Pz1m-914F9.png

利点

  • 非同期処理にすることでユーザなどに、すぐにレスポンスを返すことができる。
  • システムを単純な処理(EC2)の疎結合で構成することが可能。
  • パフォーマンスやサービスの要件に対して、ジョブ処理に利用するEC2の増減のみで対応が可能。例えば、上記図の③処理部分がボトルネックになっている場合は、その部分のEC2を増やせばよい。
  • EC2に障害が起きてもキューサービスにメッセージ(ジョブ)が残っているため、EC2が回復次第、すぐに処理を続けることができ、障害に強いシステムとなる。

注意点

  • ジョブの失敗時にキュー上のメッセージが残り続けたり、二重処理や中途半端な状態を防ぐ必要がある。防ぐ方法として下記が考えられる。
    • ジョブ処理プログラムのメッセージの待ち受けタイミング(処理)を調整
    • メッセージのVisibility Timeout(受信したメッセージが再び可視化するまでの時間)の調整

その他

  • Priority Queueパターンを組み合わせることも可能である。
  • Amazon Simple Workflowを用いるとQueuing Chainを非常に簡単に実装できる。

寄贈したアーキテクト

Ninja of Three

Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox