Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
1MBの壁にぶつかった話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
赤神青空
PRO
September 03, 2026
Video
Programming
27
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
1MBの壁にぶつかった話
赤神青空
PRO
September 03, 2026
Video
More Decks by 赤神青空
See All by 赤神青空
【ORM不要論の歴史】2026年の不要論は何を言っているのか
akagami
PRO
0
13
【ORM不要論の歴史】運用の問題は、いまの責務論に直結する
akagami
PRO
0
11
【ORM不要論の歴史】なぜ生まれ、20年前に何を言われたか
akagami
PRO
0
19
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
95
【ORM不要論の歴史】「ORM」と呼ばれているものが3つある
akagami
PRO
0
53
【Vitest5.0大解剖】Vitest5.0で消えた記法とAPI
akagami
PRO
0
24
【Vitest5.0大解剖】Vitest5.0で増えた書き方
akagami
PRO
0
32
【Vitest5.0大解剖】Vitest5.0で静かに変わる挙動
akagami
PRO
0
27
【Vitest5.0大解剖】Vitest5.0のTrace View
akagami
PRO
0
28
Other Decks in Programming
See All in Programming
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
0
400
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.5k
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
210
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
130
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
470
Intent as Code
shoppingjaws
2
410
AIと壁打ちしながら進めるコスト管理
fufuhu
2
2k
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
470
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
410
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
120
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
180
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
A Tale of Four Properties
chriscoyier
163
24k
Documentation Writing (for coders)
carmenintech
77
5.5k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
480
How GitHub (no longer) Works
holman
316
150k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
590
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
202
76k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
230
Accessibility Awareness
sabderemane
1
200
Transcript
2026年8月 1MB の壁にぶつかった話 ローカルでは絶対に再現しない 赤神 青空 SCOM
▪アンケートの集計ツール/NestJS 前提:本番だけ Data API を挟んでいる + TypeORM + Aurora ローカル開発環境
Docker の PostgreSQL に通常のドライバで直結 結果セットのサイズ上限がない だから、このバグは一度も再現しない 本番環境 Lambda から Data API 経由で Aurora へ VPC 内に Lambda を置かずに済む構成 1クエリの結果セットは 1MB まで この一点の差だけが、今日の話の全てです。 今ココ 前提 2/10
▪その間、デプロイもコード変更もしていない 症状:昼は動いていた画面が、夜には 500 昼 21:18 翌朝 +15分 今ココ 症状 担当者が「回答一覧」画面を普通に使えていた
同じ画面が HTTP 500。以降ずっと開けない 「まだ再現している」と報告 本番のログを見て、1行で原因確定 3/10
▪コードから立てた仮説は、どれも「形は合っている」 外れた仮説 500 が返る経路として、まず2つを疑った。 どちらも、症状の形とは矛盾していなかった。 01 02 判定が failure だと例外
→ そのまま 500。「403 ではなく 500」と 形が合う 前日に修正を2件入れていた。調べたら dev 止まりで本番未反映だ った 認可ライブラリ 今ココ 調査 デプロイ不整合 4/10
▪本番の ログ1行で確定した Lambda ロググループに、同じ例外が繰り返し出ていた The result exceeds the size limit
1 MB. Data API の仕様 1クエリの結果セットは 1MB まで。超えると API が 400 を 返す。 設定では変えられない Data API 側の固定値。結果サイズを減らして下回らせるし かない。 フレームワークがこの例外を拾えず、そのまま 500 になって画面に出ていた。 今ココ 真因 5/10
▪一覧を取得しているのは、これだけ 犯人のコード 特殊なことは何もしていない。ごく普通の書き方。 ts this.responses.find({ where: { surveyId, collectorId },
relations: { respondent: { organization: true }, answers: { question: true }, }, }) 今ココ 真因 6/10
▪552 行 既定では、1本の LEFT JOIN になる = 46 回答 ×
12 設問。各行に回答データが丸ごと乗る 意図している姿 実際に返ってきたもの 46 件 552 行(46 回答 × 12 設問) 回答 ︙ 回答A 回答データ 4.8KB 設問1 回答データ 4.8KB 回答B 回答データ 4.8KB 設問2 回答データ 4.8KB 設問3 回答データ 4.8KB 設問4 回答データ 4.8KB 合計 220KB 設問への回答 LEFT JOIN 552 行 値だけの軽い行 ︙ 同じ回答データが 552 回コピーされる 結果セットのサイズ(概算) 上限 1MB ︙ 概算 2.5MB 回答データは 46 個ぶんだけ 1MB を超えた瞬間に Data API が 400 1MB に対して十分に軽い アプリ側は拾えず、そのまま 500 1行に付いている重い荷物が、552回コピーされている(2.5MB は概算) 今ココ 真因 7/10
▪まだ答えていない設問には、行がそもそも存在しない 伏線回収:このバグは時間とともに発症する 行が増える → 回答が集まる 行が増える → 回答データの複製も 閾値へ 設問が埋まっていく
昼は開けたのに夜は落ちた その日のうちに回答が集まり、閾値を越 えた。 今ココ 真因 その分だけ増える 壊れ方が特殊 リリースを疑っても、原因はそこにな い。 突然 500 デプロイなしで 壊れる 静かに近づく 動いているうちは、誰も気づけない。 8/10
▪上限は変えられないので、結果サイズを減らす 直し方 01 直積をやめる(relationLoadStrategy) テーブルごとに別クエリで取らせる。552行 → 46行 + 軽い552行に分かれ、掛け算の構造が消える。 02
重いカラムを読まない(射影) 一覧が使うのは受付番号と回答者名だけ。必要な列だけ取ると1件 数KB → 百数十バイト。余裕が2桁変わる。 03 それでも上限との距離は残る 設問への回答は 回答件数 × 設問数 で育つ。12設問なら回答800件規模で再び当たる(概算)。 今ココ 対処 9/10
▪今日いちばん言いたいこと まとめ ローカルの緑が保証しているのは、 ローカルで動くことだけ。 この修正が効いたことは 1MB上限が無いので、修正前のコードも普通に動く。 「直った」の最終確認は 本番にデプロイした後にしかできない。PR にもその旨を明 記した。
ORM のデフォルトは、その先にどんなサービスが挟まっているかを知らない。 今ココ まとめ 10/10