CDP:Queuing Chainパターン
From AWS-CloudDesignPattern
システムの疎結合化
Contents |
解決したい課題
複数のシステムで処理を連携させて逐次的な処理を行う場合(例えば、画像処理の場合、画像のアップロード、保存、エンコーディング、サムネイル作成、などの逐次作業が考えられる)、そのシステム同士が密に結合されていると、逐次処理になるためパフォーマンスのボトルネックが出現しやすい。また、障害時の復旧作業が非常に煩雑になってしまう。できるだけシステムを疎結合にすることがパフォーマンスやメンテナンスの面でも好ましい。
クラウドでの解決/パターンの説明
システムを疎結合にする方法の1つとして、システム間をキューでつなぎ、仕事(ジョブ)の受け渡しをメッセージの送受信で行うことで、非同期化を実現できる。この場合、メッセージをとって処理をする仮想サーバの数を増やして並列処理を行うこともできるため、ボトルネックを解消しやすい。また、処理を行う仮想サーバに障害が発生しても、未処理のメッセージはキューに残っているため、仮想サーバが復旧次第、処理を容易に再開することも可能となる。
Queuing Chain自体はオンプレミスや仮想化環境でも行う事は出来たが、キュー自体がクラウドサービスとして提供され、仮想サーバを瞬時に柔軟に調達可能であるクラウドの特性により、以前よりも格段に行いやすくなっている。従って改めてCDPの1つとして挙げる事とした。
実装
Amazon SQSを用いるとキューのミドルウェアを運用することなく、必要なときに必要なだけ安価な価格でキューサービスを用いることができる。キューにジョブを出し入れするプロセスを走らせるのにEC2を用いた例を下記に示す。
- ある処理を担当するEC2インスタンスから、次の処理を担当するEC2インスタンスへの処理の受け渡しはSQSを仲介して行う。
- EC2上でのジョブ処理は下記のように行われる。
- ジョブ(メッセージ)の受信 → ジョブの処理 → ジョブ(メッセージ)の送信
- 仮想サーバはジョブの性質により複数稼働させることも可能。
構造
利点
- 非同期処理にすることでユーザなどに、すぐにレスポンスを返すことができる。
- システムを単純な処理(EC2)の疎結合で構成することが可能。
- パフォーマンスやサービスの要件に対して、ジョブ処理に利用するEC2の増減のみで対応が可能。例えば、上記図の③処理部分がボトルネックになっている場合は、その部分のEC2を増やせばよい。
- EC2に障害が起きてもキューサービスにメッセージ(ジョブ)が残っているため、EC2が回復次第、すぐに処理を続けることができ、障害に強いシステムとなる。
注意点
- ジョブの失敗時にキュー上のメッセージが残り続けたり、二重処理や中途半端な状態を防ぐ必要がある。防ぐ方法として下記が考えられる。
- ジョブ処理プログラムのメッセージの待ち受けタイミング(処理)を調整
- メッセージのVisibility Timeout(受信したメッセージが再び可視化するまでの時間)の調整
その他
- Priority Queueパターンを組み合わせることも可能である。
- Amazon Simple Workflowを用いるとQueuing Chainを非常に簡単に実装できる。