Miscellaneous notes

主に技術的な雑記的な

Azure Job Scheduler + AWS Lambdaで定期的に大量のジョブを並列で実行させるためのパターンを考えてみる

前回の Azure Job Scheduler + AWS Lambdaで夢のサーバレス定期ジョブを実現する - Miscellaneous notes 続きです。
今回はまだ考察・アイデアレベルでまだ試してません(そもそも、このアイデアについてのコメントなどいただけることを期待していたりいなかったりw)

実際にやりたいジョブはそう単純じゃない

単一または少ない数の単純なジョブであれば、S3バケットと1:1で紐づけてやっても良いかと思います。
でも、実際にやりたいことはそうじゃなかったりします。
複数のジョブをまとめて実行したかったり、対象が多いために並列で一気に処理したかったりするわけです。

Azure Job Schedulerに登録できるJob数にもS3バケット数にも上限がありますし、大量のJobを効率的に管理する必要があります。

従来では

ジョブの発行者(Publisher)と実行者(Worker)を分け、その間をSQSなどのキューで繋ぐ方法があります。
Workerを増やすことで並列度を上げることができ、Auto Scalingを適用すればある程度のコスト最適化も図れます。

また、ここでもAzure Job Schedulerを利用することで、以下のようにSPOFの無い構成を作ることができるかと思います。
(Azureのアイコン群で作ってみましたが、青だけだと分かりにくい気がするのはAWSに慣れすぎたせいでしょうか?w)

f:id:FumblePerson:20150119125441p:plain

従来の方法の問題点

  1. 管理すべきサーバが多い
  2. Auto Scalingの閾値が難しい
  3. 極端に多くなった場合に、分散処理できないPublisherが限界を迎える可能性がある
  4. Auto Scalingといえど、やはり並列定期ジョブでは無駄が生じる

1,2はそのままの意味です。
3は、さらにキュー(とWorker)を挟んだりすることで解決する方法もありますが、複雑になります。
そして、一番の問題は4です。
要は例を挙げて説明すると、
「5分に一度1分以内に大量のジョブを処理したい」と思ったときに、ピークは明らかに最初の1分だけであるにも関わらず、Auto Scalingではそこまで細かな制御ができないため、「最初の1分に合わせた台数のサーバが必要になる」ということです。

じゃあ、どうしたら良いだろうか?

答え:それ、全部Lambdaでやっちゃいましょう

こんなのはどうでしょう?

f:id:FumblePerson:20150119123502p:plain

  1. ジョブをグループ化して、それぞれ適切な単位で別々のリストとして保存します。
  2. Azure Job SchedulerからグループIDをURLに含んだPUTリクエストを投げます。
    前回はURLに認証文字列を含みましたが、任意のヘッダを指定できるのでUser-Agentあたりにすると良さそうです。S3 Bucket PolicyUser-Agentでの許可設定が可能です。もちろん、S3 Event Notificationには更新されたオブジェクトのキー情報が含まれています。
  3. グループIDに対応するリストの数だけPublisherとなるLambdaを起動し、処理すべきリストを与えます。
  4. 起動されたPublisherはそれぞれ与えられたリストの中身を見て、その中のジョブ数分だけ一気にLambdaを起動し、Jobを実行させます。

必ずしもこの方法である必要はありません

要点としては以下のような点です。

  • リクエスト処理ジョブ発行ジョブ実行を全て分離する
  • 後ろに行くにつれ並列処理が必要となるが、それぞれが必要な分だけ起動できるようにする
  • 段階的に起動数を増して、粒度を細かくしていくことで、最終的な並列度を極限まで上げる

これによってどうなるか?

  • 管理すべきサーバが存在しない
  • ジョブのリスト分割方法を変えるだけで起動数を調節できる
  • Lambdaの課金は起動リクエスト数100msec単位の実行時間で、適宜必要な分だけ起動して最小の処理で終了して破棄できるため無駄がない
  • 並列度をいくらでも上げられる

最後に

こういう感じの新しいサービスに対応した新しいCDP(Cloud Design Pattern)が欲しい感じする。
MCDP(Multi Cloud Design Pattern)とか収集つかなくなりそうだけど、面白そうw
是非、ご意見お待ちしておりますm(__)m