テックブログ vol.3 -サーバーレスな並列分散処理と待ち合わせ-
更新日:9月12日
はじめに
こんにちは!感性AIエンジニアの堀池です。
この記事では、サーバーレスな並列分散処理をAWSで構築したときの構成についてお話しさせていただきます。
やりたかったこと
数千から数万枚ある画像に対して特徴をタグ付けするバッチシステムを構築しました。
すべての画像に対してシーケンシャルにタグ付けすると時間内に処理が終わらないため、並列分散処理で時間短縮を試みました。
並列分散処理
並列分散処理は、AWSのサービスを組み合わせれば比較的容易に実現できそうだという感触がありましたが、分散した処理を待ち合わせてから後続処理を実行するための仕組みはなく、工夫する必要がありました。
待ち合わせ
待ち合わせは、分散しているそれぞれが処理を終えたとき「自分が一番最後に処理を終えたか」を判断するようにしました。一番最後に処理を終えたなら分散処理全体として終了、そうでなければ処理中とみなします。
その判断をするための手段として、分散した処理の数から1を引いた分のメッセージを用意します。タグ付けを終えたらメッセージの取得を試み、既にメッセージが存在しなければ分散処理全体で一番最後の処理となるため、後続処理を実行するためのアクションを行います。
SQS+Lambda
ここからは具体的なAWSのサービスと組み合わせて構成を考えます。
処理の分散はSQSとLambdaを利用しました。
SQSに画像のパスを登録し、複数同時起動したLambdaがSQSから画像のパスを取得し、パスから取得した画像に対してタグ付けを行います。ここではLambda関数の起動にSQSトリガーは用いず、画像パスをすべて登録した後、別のLambda関数からタグ付けの関数を起動するようにしました。
分散処理の待ち合わせもSQSを利用しました。
タグ付けを実行する前に同時起動数から1を引いた分のメッセージをSQSに登録します。メッセージ自身は情報を持たず、タグ付け処理はメッセージが取得できたらSQSから削除し、取得できなければ後述するコールバックを行います。