4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1年間の活動を振り返るAdvent Calendar 2023

Day 23

非同期に苦しんだお話

Last updated at Posted at 2023-12-22

はじめに

今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

使用技術

・Lambda
・API Gateway WebSocket API
・Python

非同期に苦しんだお話

やりたかったこと

・バックエンドでフロントからデータを受け取る・・・①
・受け取ったデータを外部APIにリクエストし、レスポンスデータをデータベースに保存する・・・②
・データベースからデータを取得し画面に表示する・・・③

WebSocket(以下ws)のクォータ制限

当初は普通にデータを送信していましたが、大規模データを送信する際にクォータ制限に引っかかってしまう問題がありました。
32KBを超えるデータはwsで送信できないようです。そのためデータを分割する方針で実装していたのですがこれが後の悲劇を起こすことになるとは思っていませんでした。

image.png

非同期の分割処理

最初は分割の数だけ処理①のハンドラーを実行、処理②のハンドラーでデータベースを参照して分割が終わっていることを確認できたらデータを結合して外部APIにリクエストをしていました。

「あれ、画面に複数のデータが表示されるぞ…」

CloudWatchを確認すると、処理②のハンドラーが複数実行されていました。

何回か動かしていると画面に複数のデータが表示されるときがあったりなかったり…

ここに非同期の落とし穴がありました。

分割の数だけ処理①のハンドラーを非同期で実行しているので、先に処理②のハンドラーが完了してしまうとその時点で外部APIにリクエストが行われてしまいます。

そもそも分割しない

フロントからws経由でバックエンドにデータを送るのではなく、バックエンドでデータ保存のハンドラーを用意しそのハンドラーを叩くようにしました。
そしてフロントからは保存したデータのidなどをバックエンドに送り、idをキーにデータベースからデータを取得してそのまま外部APIにリクエストするようにしました。
これでwsのクォータ制限と非同期問題を回避することができました。

おわりに

もっとはやく気づきたかったです。
wsやlambdaについて学ぶことができたので良い経験になりました。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?