概略
Flaskを用いてWebAPIサービスを構築した際のメモを共有します。
このWebAPIサービスは以下の要件を満たしているものとします。
- あるWebAPIを呼び出すことによって,呼び出し元に特有のファイルを生成してダウンロードできるようにする。
- 上記で生成したファイルは一定時間経過後,自動的に削除すること。
- nginx + uwsgi + flask の形でdeployする。
FlaskでのBackground処理
今回の実装において,「一定時間経過後,作成したファイルを自動的に削除」機能の実装に苦労しました。最初の開発環境では,一定時間後に作成したファイルを削除する処理を実行するThreadを別途作成していましたが,nginx + uwsgi + flask の環境にdeployすると,そのThreadが実行されない問題に遭遇しました。
おそらく,uwsgiに"harakiri"モードを設定していたため, nginx + uwsgi + flask環境では,harakiriモードがFlask自体のプロセスが強制終了したために,削除するThreadが実行されなかったと推測します。
Flaskでは,background処理をどのようにすべきでしょうか。方針はFlaskのdocumentにありました。
Celery Background Tasks
Flaskのdocumentにずばりそのものがありました。
Celery Background Tasks
より引用です。
If your application has a long running task, such as processing some uploaded data or sending email, you don’t want to wait for it to finish during a request. Instead, use a task queue to send the necessary data to another process that will run the task in the background while the request returns immediately.
大雑把に訳すと,「 データをアップロードしたりemailを送信するといった時間のかかる処理を含むのならば,その処理が完了するまで待つのでなく,タスクキューを使ってバックグラウンドでその処理を実行し,リクエストに対してはすぐに返答しなさい」
でしょうか。
このdocumentにはバックグラウンド処理をする際にどのようにCeleryを用いるか記載されています。このdocumentとCeleryのチュートリアルFirst Steps with Celeryに従って,実際の実装を行いました。
今後の予定
実際には,上記WebAPIサービスを提供するDocker imageを作成して,Kubernetes上にdeployしました。deployする際に,どうceleryを動かすかについて一悶着がありましたので,それに関連した経験談に関してはまた後日。