最近修論研究の一環でAPIを実装する必要があり,非同期処理を求められることがありました. サーバ側の非同期処理について今回簡単なものを書いてみて理解が深まった気がするのでちょっと設計や参照した資料をメモしておきます. 次の技術を使いました:
- サーバ(Flask)
- REST APIの形にした
- HTTP通信のメソッドで大まかなクエリの役割を指定し,ステートレスな感じ(セッション情報などは使わない,リソースに対して一意な結果が返ってくる)の設計にしたらRESTなんじゃねと思っている .
- ZMQとかはHTTPじゃなさそうなので異なる.Azure SDKもHTTP以外のプロトコルを使ってそうなので違うかも.
- 非同期処理(メッセンジャーキュー方式)
- タスクの可視化
- Flowerによる監視.celery自体のログにも出るけどこっちはブラウザ上から設定とか色々見やすい.
設計としては以下の図のような感じで行いました.実装手順としては,REST APIとしてどういうリクエストを送ったらどういうものが返ってきて欲しいか要件を書いてchatGPTに聞く→概形が出力されるので,自分が言いたいことと処理が一致してるかどうかと細かいバグをチェックしながら概形を立てる→デバッグしながらコードを洗練化させるという感じで行いました.
今回Flask,Celery,Redisと全部の技術を触るのが初だったのですが,この方法だと爆速で開発ができて(正味で5時間くらい?)驚きました.chatGPTがある程度正解を示してくれるため,詰まった問題部分も細分化しやすかった気がする.デコレータや非同期処理の新しい実装の仕方とか学べたので非常に良かった.あとはターミナルでだるいので,Dockerfileで複数サーバをまとめて立てることができるようにした.ローカルの開発にはvenvを使用した.
詰まった点としては,普通にRedisにデータ送られてない?→Redisが起動してないだけ.というのがありました(むしろここだけ)....Celeryを起動した時にCeleryがよしなにしてくれるのかなと思ってましたが,違ったみたいです. 結局,サーバはFlask, Redis, (Flower)の3つを立てる必要がありました. まあ,ソフトウェアは大体個別に起動しないといけないと覚えとこう.
やっぱり各サービスがどういうものなのか大まかに知っておくことがデバッグの際,GPTがカバーしきれない部分もスムーズに解決できるんじゃないかなと思います.目先の文法とかじゃなくて技術に対する深い理解を学ばねば...コーディングを支える技術とか読みたいんだよな.