1
/
5

【感性AI】テックブログ vol.3 -サーバーレスな並列分散処理と待ち合わせ-

はじめに

こんにちは!感性AIエンジニアの堀池です。

堀池 大樹's Wantedly Profile
https://www.wantedly.com/id/daiki_horiike_v

この記事では、サーバーレスな並列分散処理をAWSで構築したときの構成についてお話しさせていただきます。

やりたかったこと

数千から数万枚ある画像に対して特徴をタグ付けするバッチシステムを構築しました。
すべての画像に対してシーケンシャルにタグ付けすると時間内に処理が終わらないため、並列分散処理で時間短縮を試みました。


並列分散処理

並列分散処理は、AWSのサービスを組み合わせれば比較的容易に実現できそうだという感触がありましたが、分散した処理を待ち合わせてから後続処理を実行するための仕組みはなく、工夫する必要がありました。


待ち合わせ

待ち合わせは、分散しているそれぞれが処理を終えたとき「自分が一番最後に処理を終えたか」を判断するようにしました。一番最後に処理を終えたなら分散処理全体として終了、そうでなければ処理中とみなします。

その判断をするための手段として、分散した処理の数から1を引いた分のメッセージを用意します。タグ付けを終えたらメッセージの取得を試み、既にメッセージが存在しなければ分散処理全体で一番最後の処理となるため、後続処理を実行するためのアクションを行います。

SQS+Lambda

ここからは具体的なAWSのサービスと組み合わせて構成を考えます。
処理の分散はSQSとLambdaを利用しました。
SQSに画像のパスを登録し、複数同時起動したLambdaがSQSから画像のパスを取得し、パスから取得した画像に対してタグ付けを行います。ここではLambda関数の起動にSQSトリガーは用いず、画像パスをすべて登録した後、別のLambda関数からタグ付けの関数を起動するようにしました。

分散処理の待ち合わせもSQSを利用しました。
タグ付けを実行する前に同時起動数から1を引いた分のメッセージをSQSに登録します。メッセージ自身は情報を持たず、タグ付け処理はメッセージが取得できたらSQSから削除し、取得できなければ後述するコールバックを行います。

Step Functions

前述の処理は順序に従って実行する必要があります。そのため、Step Functionsを利用してワークフローを作成しました。
Step Functionsでワークフローを意味するステートマシンは2種類用意しました。

  • 処理順を制御するメインステートマシン
  • タグ付けを行うサブステートマシン

各ステートマシンをもう少し詳細に記載します。
メインステートマシンに後続処理を、サブステートマシンにタグ付けのくり返しと終了判定を追加します。くり返しの条件は画像パスをSQSから取得できたかどうかで、取得できなければ終了判定を行います。

Step Functionsのコールバック待機

あとは、分散したタグ付け処理(サブステートマシン)を呼び出してから応答が返るまで待機できれば完成です。
この仕組みは、Step Functionsのコールバック待機を利用しました。
Step Functionsには、ステートマシンから別のステートマシンを呼び出すための統合パターンが3つ用意されています。コールバック待機は、ステートマシンが別のステートマシンを呼び出す際にTask Tokenを渡し、渡したTask Tokenが返却されるまで待機するパターンになります。

今回のケースでは、メインステートマシンから各サブステートマシンをTask Tokenを付けて呼び出し、タグ付け後、並列分散処理が終了したと判断したサブステートマシンがメインステートマシンにTask Tokenを返却することで実現しました。

おわりに

当初、並列分散処理と待ち合わせという構成は広く用いられているものだと考えていたため、少し調べれば多くの事例が見つかると思いましたが、やりたいこととマッチするものは少なく、トライアルを重ねてなんとか今の形に落ち着かせることができました。もう少しシンプルに組めるとよいと思ったので、これからのAWSサービスのアップデートに期待したいと思います。



感性AI株式会社's job postings
4 Likes
4 Likes

Weekly ranking

Show other rankings