若き研究者の日常

技術寄りの事かポエムを書く。

メッセンジャーキューを通した非同期処理(Flask+Celery+Redis)

最近修論研究の一環でAPIを実装する必要があり,非同期処理を求められることがありました. サーバ側の非同期処理について今回簡単なものを書いてみて理解が深まった気がするのでちょっと設計や参照した資料をメモしておきます. 次の技術を使いました:

  • サーバ(Flask)
    • REST APIの形にした
    • HTTP通信のメソッドで大まかなクエリの役割を指定し,ステートレスな感じ(セッション情報などは使わない,リソースに対して一意な結果が返ってくる)の設計にしたらRESTなんじゃねと思っている .
  • 非同期処理(メッセンジャーキュー方式)
    • Celery+ Redisで行った.Redisは言わずもがな爆速NoSQL DBでブローカーと言われるタスクデータの保持役,Celeryは分散タスクキューシステム(要するに,DBに書き加えるとかその辺のめんどいことをデコレータで簡単な書き方にしてくれるライブラリという解釈)でワーカーと言われている.
  • タスクの可視化
    • Flowerによる監視.celery自体のログにも出るけどこっちはブラウザ上から設定とか色々見やすい.
      flowerを起動するとceleryに飛んできたタスクとかがダッシュボードで可視化できる.

設計としては以下の図のような感じで行いました.実装手順としては,REST APIとしてどういうリクエストを送ったらどういうものが返ってきて欲しいか要件を書いてchatGPTに聞く→概形が出力されるので,自分が言いたいことと処理が一致してるかどうかと細かいバグをチェックしながら概形を立てる→デバッグしながらコードを洗練化させるという感じで行いました.

構成.redisは爆速DBって聞いたのと記事が多かったから使った.Celeryは分散タスクワーカーでこれしか出てこなかったから使った.Flaskは軽量のPythonサーバーだったから使った.

今回Flask,Celery,Redisと全部の技術を触るのが初だったのですが,この方法だと爆速で開発ができて(正味で5時間くらい?)驚きました.chatGPTがある程度正解を示してくれるため,詰まった問題部分も細分化しやすかった気がする.デコレータや非同期処理の新しい実装の仕方とか学べたので非常に良かった.あとはターミナルでだるいので,Dockerfileで複数サーバをまとめて立てることができるようにした.ローカルの開発にはvenvを使用した.

chatGPTと相談しながらコーディングすると,うろ覚えとか知らない細かいディティールはコードで示してくれるのと,Stackoverflow的な回答もすぐに出してくれる...

詰まった点としては,普通にRedisにデータ送られてない?→Redisが起動してないだけ.というのがありました(むしろここだけ)....Celeryを起動した時にCeleryがよしなにしてくれるのかなと思ってましたが,違ったみたいです. 結局,サーバはFlask, Redis, (Flower)の3つを立てる必要がありました. まあ,ソフトウェアは大体個別に起動しないといけないと覚えとこう.

redisをメッセンジャーキューとして使っているため,当然redisを落とすとエラーを吐き始める.しかしコネクションの再確立を勝手に目指してくれるので結構親切.

`redis-server`コマンドを実行してredisを起動させると動作が復帰する.

やっぱり各サービスがどういうものなのか大まかに知っておくことがデバッグの際,GPTがカバーしきれない部分もスムーズに解決できるんじゃないかなと思います.目先の文法とかじゃなくて技術に対する深い理解を学ばねば...コーディングを支える技術とか読みたいんだよな.

参考

Pythonのデコレータの基礎と応用

CeleryによるPythonベース非同期タスク処理