はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます
使用技術
・Lambda
・API Gateway WebSocket API
・Python
非同期に苦しんだお話
やりたかったこと
・バックエンドでフロントからデータを受け取る・・・①
・受け取ったデータを外部APIにリクエストし、レスポンスデータをデータベースに保存する・・・②
・データベースからデータを取得し画面に表示する・・・③
WebSocket(以下ws)のクォータ制限
当初は普通にデータを送信していましたが、大規模データを送信する際にクォータ制限に引っかかってしまう問題がありました。
32KBを超えるデータはwsで送信できないようです。そのためデータを分割する方針で実装していたのですがこれが後の悲劇を起こすことになるとは思っていませんでした。
非同期の分割処理
最初は分割の数だけ処理①のハンドラーを実行、処理②のハンドラーでデータベースを参照して分割が終わっていることを確認できたらデータを結合して外部APIにリクエストをしていました。
「あれ、画面に複数のデータが表示されるぞ…」
CloudWatchを確認すると、処理②のハンドラーが複数実行されていました。
何回か動かしていると画面に複数のデータが表示されるときがあったりなかったり…
ここに非同期の落とし穴がありました。
分割の数だけ処理①のハンドラーを非同期で実行しているので、先に処理②のハンドラーが完了してしまうとその時点で外部APIにリクエストが行われてしまいます。
そもそも分割しない
フロントからws経由でバックエンドにデータを送るのではなく、バックエンドでデータ保存のハンドラーを用意しそのハンドラーを叩くようにしました。
そしてフロントからは保存したデータのidなどをバックエンドに送り、idをキーにデータベースからデータを取得してそのまま外部APIにリクエストするようにしました。
これでwsのクォータ制限と非同期問題を回避することができました。
おわりに
もっとはやく気づきたかったです。
wsやlambdaについて学ぶことができたので良い経験になりました。