Help us understand the problem. What is going on with this article?

Flaskを用いてWebAPIサービスを構築した際の経験談

More than 1 year has passed since last update.

概略

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を動かすかについて一悶着がありましたので,それに関連した経験談に関してはまた後日。

abekatsu
Software engineer, I hope. Previously working for IP networking.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away