コンテンツにスキップ

スケール・容量計画の振り返り・解説

出題の入口に先に回答し、必要な節から復習する。以下はAIによる一般化した解説。数値・障害は演習上の追加条件で、実環境の観測や本人の経験ではない。資料確認日:2026-09-09。対象:PostgreSQL 18、node-postgres公開資料(版未固定)、AWSの更新型資料、Grafana k6 latest(試験ツール未導入)、Google SRE Book。

解説図:burst完了とqueue解消を図で比較

ChatGPT開始文
https://github.com/MFQWKMR4/tech2026 の CHATGPT.md、AGENTS.md、
src/content/docs/career/index.md と次のファイルを読み、
architecture-scaling の振り返りを一緒に読むlearnセッションを始めてください。
- src/content/docs/architecture/scaling.mdx
- public/diagrams/architecture-scaling/backlog-composition.svg
- reviews/architecture-scaling.yaml
- sessions/2026-09-08-architecture-scaling-01.yaml
- diagrams/architecture-scaling/connection.json
- diagrams/architecture-scaling/backlog.json
- diagrams/architecture-scaling/capacity.json
- src/content/docs/practice/scaling-capacity.md
- sessions/2026-09-10-int-burst-01-01.yaml
reviewに新しいsessionがあればそちらも確認してください。
参照できたファイルとcommitを示し、不明はunknownとしてください。
図JSONの読解と描画の確認を区別してください。
まず希望する節を一つだけ聞き、回答を待ってください。
指定がなければneeds_revisitから、一節ずつ説明→追加疑問→理解確認へ進めてください。
演習は問題だけを一問ずつ提示し、模範解答を先に出さないでください。
終了時は実際の回答を根拠に、CHATGPT.mdと既存テンプレートに従ってYAML+Session narrativeを含む [Session Sync] GitHub IssueをMFQWKMR4/tech2026に作成し、URLを返してください。作成できない場合は未作成と明示し、コピー可能なタイトルと本文を返してください。

2026-09-10の横断面接:回答・支援・不足別の再学習

最終レビュー:2026-09-10 · 説明した(Explained)。ヒント後の理解と自力の説明を区別して記録しています。

次回、自力で確かめたいこと

  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / DB connection pool問題を別条件で再出題し、connection総数だけでなくconnection hold time、query/transaction/lock wait、pool waitを自発的に切り分けられるか確認する。 根拠・ヒントは本sessionの該当観察を参照。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / arrival rate・processing rate・burst duration・backlog・deadlineから、許容arrival rateやdrain timeを式で自力計算する問題を再出題する。今回、drain timeを一度見落としたため。 根拠・ヒントは本sessionの該当観察を参照。 SLOの起点とburst後の通常流入をまず確認する。 2026-09-10 [2026-09-10-int-burst-01-01] 原稿Q2は未出題。backlog、burst集団完了、全queue解消を別sessionで独力確認する(今回の不足認定ではない)。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / rate limit / quota / priority / tenant isolationを同じnoisy-neighbor scenarioで比較し、公平性・SLO・UX・system protectionのtrade-offを理由付きで選べるか確認する。 根拠・ヒントは本sessionの該当観察を参照。 quota質問への説明はあり。ただしAWSではrateもquotaに含むため、AI説明の単純化を訂正して再確認する。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / 負荷試験でcapacityを固定してloadを増やし、throughputの飽和、tail latency、error、queue/DB/network等からknee pointを判定する設計をヒントなしで再説明する。 根拠・ヒントは本sessionの該当観察を参照。

2026-09-10のセッション

INT-BURST-01 v1(2026-09-09)の口頭interview。開始問題「イベント開始時に受付が集中し、受付後に外部サービスを使って処理するシステム」で、初回独力回答ではAPI serverのhorizontal scaling、queueによるproducer/consumer分離、外部APIの処理能力に合わせたconsumer側rate調整、queue容量設計、受付完了と処理中/完了の状態表示を提案した。進捗表示では当初「受付APIではDB書込みを発生させたくない」とし、queue投入時に受付成功を返し、consumer開始後にDBへprocessing、完了後にcompletedを記録して状態取得APIで見せる案を出した。

Q1初回独力でAPI水平分散、queue、下流能力に合わせたconsumer rateを提案。Q2容量、DB占有、Q4は未出題。新しい容量不足の観察は登録しない。

問い・回答の流れをIssueで読む

2026-09-08のセッション

architecture-scaling の初回 interview。API traffic 10倍を起点に、水平スケールと共有ボトルネック、DB connection pool、外部副作用とidempotency、noisy neighbor、rate limit / quota、scheduled scaling、queueによる平準化、consumerのbackpressure、429 / retry / DLQ、arrival rate・processing rate・backlog・deadlineによるcapacity計算、負荷試験でのcapacity limit判定まで条件を一つずつ変えて確認した。開始時刻は会話上確認できた最早タイムスタンプ基準で22:15頃、終了時刻は23:51頃(America/Toronto)、所要時間は約1時間36分。厳密なストップウォッチ計測ではなく概算。

共有制約・tenant制限・backlog増加量・CPUだけでは判断しない点を自力で説明。pool保持時間・通信境界・drain・capacity固定は説明後。replica/shardingとdrainの初回誤答はsessionに保持し、修正後の独力再確認は未実施。quotaの質問を欠落の証拠にせず、AI説明の単純化は教材で訂正。statusはExplained、実装適用・独力再確認の実績はない。

問い・回答の流れをIssueで読む

回答で示せたこと(ヒントの有無を含む)
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / アプリケーションサーバーの処理はhorizontal scalingで増やせる一方、DB・外部API・network帯域・connection数・排他制御は別の制約になると自発的に切り分けた。回答要約: 『サーバーで行われる処理はホリゾンタルオートスケーリングで解決できる』『依存している外部APIとかデータベース』『ネットワーク系の帯域』『データベースのコネクション数』『ロックが必要になるような排他制御』を先に見る。ヒント: なし。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / connection poolを小さくすることで、アプリ台数増加に伴うDB connection総数の増加を抑えられると理解した。回答要約: 『アプリケーション側のコネクションプールの数を絞る』『アプリケーションサーバーが増えてもコネクション数をキープできる』。ヒント: DB connection上限を増やす話とDB scaleの話を分ける説明の後。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / 外部API待ちのためにDB connectionを長く保持する設計を問題と認識し、DBが必要な区間だけconnectionを保持すべきと判断した。回答要約: 『データベースが必要な部分だけで…なるだけコネクションの保有を少なくするように書かないと』。ヒント: connection利用時間とquery/transaction/lock waitを見る説明の後。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / DB transactionだけでは決済APIの副作用をatomicにrollbackできないことを自分で修正し、idempotency keyを使った再試行を提案した。回答要約: 『決済API自体はそれ時点でロールバックすることができない』『注文ID、べき等性のためのキーみたいなものを指定して決済APIに送る』。ヒント: 外部APIが決済であるという演習条件のみ。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / HTTP requestが再送されない条件に対し、外部API呼び出し前に注文処理開始状態をDBへcommitしてdurableな処理途中状態を残し、その後に決済、最後にDB状態更新する案を自発的に出した。回答要約: 『決済API呼び出し前にもう1個…DB書き込み入れて、そこはもうコミット』『注文処理開始みたいな感じ』。ヒント: idempotencyだけでは再試行対象自体を覚える必要がある、という追加条件。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / 一顧客がcapacityを圧迫するnoisy-neighbor条件に対してtenant単位rate limitを自発的に提案した。回答要約: 『レートリミット入れてもいい』『一顧客だけが全体を使いまくる…全体に悪影響を及ぼすことは防げる』。ヒント: なし。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / 毎日決まった30秒burstに対してscheduled scalingを提案した。回答要約: 『事前にわかっているのであれば…スケールをスケジュールする』。ヒント: なし。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / 予測不能なburstかつ数分以内処理でよい条件では、queueに詰めてconsumerが処理する非同期architectureを提案した。回答要約: 『一番最初の受け口でキューに詰め込んで、それをコンシューマーが処理する』。ヒント: 直前にqueueで平均化できるという説明あり。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / consumer低速化時にoldest message ageが前進しているかを見て、poison message的な滞留と単純な処理能力不足を切り分ける案を自発的に出した。回答要約: 『一番古いタイムスタンプ…が更新されてるか』『更新されてないとしたら…良くないデータ』『更新されてるのであれば…単純に処理速度の問題』。ヒント: なし。 同期時注記: 切り分け仮説の提示として記録。timestampだけでの確定診断は示せていない。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / 外部API 429に対してexponential backoff retryと、失敗しきったメッセージのDLQ隔離、DLQ redriveには別運用が必要という方向を説明した。回答要約: 『エクスポネンシャルバックオフのリトライ戦略』『全部失敗しきったやつをデッドレターキュー』『入ったものが勝手に戻ることってないよね』。ヒント: 429 / rate limitという条件のみ。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / arrival rate 5,000 msg/s、processing rate 1,000 msg/sの条件から、burst中は毎秒4,000件backlogが増え、burst継続時間からqueue depthを見積もる考え方を自発的に組み立てた。回答要約: 『1秒あたり4000メッセージ溜まっていく』『10秒間…4万メッセージ』『バーストがだいたい何秒ぐらい続くのかっていうのを見積もって設計』。ヒント: arrival / processing / backlog / deadlineを見るという問いのみ。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / 60秒SLOと外部API上限1,000 req/sから、処理できる総量に物理上限があり、外部API制約が変えられなければarrival側を制御する必要があると判断した。回答要約: 『1000ずつしか処理できない』『60秒以内にできることが保証できるのは…6万まで』『arrival rateをどうしてもいじるしかない』。ヒント: 30秒burst / 5,000 msg/s / 60秒SLOという演習条件。 同期時注記: 6万件は開始から60秒間の処理総量。各messageの到着から60秒というSLOとは区別が必要。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / overflow trafficの扱いとして、queueには受け入れるがSLO対象外のbest-effort扱いを選び、要件次第と留保した。回答要約: 『キューには受け入れるがSLOを対象外にするっていうのが一番しっくり』『どういう要件かにはよる』。ヒント: 選択肢提示あり。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / tenant公平性について、課金/優先度別queue、weightedな処理、queueごとのSLO、またはtenant rate limitという複数案を自発的に出した。回答要約: 『プライオリティごとのキュー』『ラウンドロビンとかで、プライオリティ高いやつから多め』『キューごとにSLO』『ユーザーごとのレートリミット』。ヒント: tenant分離・priority・quotaという観点提示あり。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / 負荷試験のcapacity limit判定で、CPU 70%だけを見て余裕ありとは判断せず、p99急増とDB/I/O等のwaitを疑うと説明した。回答要約: 『CPUが100%ではないから余裕があるとは判断しない』『I/O待ちとかが含まれない』『データベースか何らかのI/Oバウンドな処理で待ち』。ヒント: p99 300ms→1.5s、CPU 70%、error 0%という演習条件のみ。
  • 2026-09-10 [2026-09-10-int-burst-01-01] Q1初回独力: API serverをhorizontal scaling可能にし、集中後の処理をqueueでproducer/consumerへ分離し、外部APIの処理能力に合わせてconsumer側の取り出し速度を調整する案を提示した。回答要約:『最初のリクエストを受け取るAPIサーバーを水平スケール可能な形』『そこをうまく吸収するためにキュー』『外部のAPIサーバーが処理できるスピードでキューから取り出していく』。ヒント: なし。
自力では説明しきれなかったこと
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / DB connectionのnetwork request/response境界と、transaction中に同一connection上でBEGIN・query・COMMITなど複数往復が起こる仕組みを自発的には説明できなかった。本人の質問: 『トランザクション貼ったら…リクエスト一発でポンって投げられるんですかね』『どこからどこまでがネットワーク的にリクエストレスポンス』。ヒント: ChatGPTがconnection取得〜複数query〜COMMIT〜返却の流れを説明。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / connection pool枯渇が起きた際、connection待ちは現象であり、connection保持時間・query latency・transaction duration・lock waitなどを調べて根本原因を分解する観点が最初は出なかった。回答: 『原因はわかってて、コネクション取得待ち。わかんない』。ヒント: ChatGPTがconnection利用時間を起点に説明。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / 負荷試験ではsystem capacityを固定してrequest rateを段階的に増やすことでcapacity curveを測る、という実験設計が初案では出なかった。初案では『段階的に増やすは基本的にサーバー、サーバーを増やします』と回答。ヒント: ChatGPTがserver台数等を固定しrequest rateを増やすべきと説明。
理由・設計を詰めたいこと
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / p99悪化時にどこまで待たせるかについて『p95とかでいいんじゃないかな。ここは根拠ない』とし、SLO/ビジネス要件からpercentileと閾値を逆算する根拠が弱かった。ヒント: ChatGPTがp95/p99を選ぶよりSLOを置くと整理。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / consumerを増やしすぎるtrade-offについて当初『わかんない』となり、下流DB/外部APIのcapacity、connection、lock contention、rate limit、costへ負荷を押し付ける観点はヒント後に得た。
  • 2026-09-08 / 2026-09-08-architecture-scaling-01 / priority queue案では公平性の難しさを自覚し『ラウンドロビンとかで…多め』まで到達したが、strict priorityのstarvation、weighted fair scheduling、tenant quotaとの組み合わせを体系的には説明していない。ヒント: ChatGPTがweighted round robin / weighted fair queuingとstarvationを説明。
修正が必要な説明

記録された項目はありません。

Default:appを増やす前に共有制約と接続予算を確認する

Section titled “Default:appを増やす前に共有制約と接続予算を確認する”

statelessなappは処理を分散しやすいが、DB・外部API・共有lockが同じならそこは増えない。最大app数×プロセス当たりpool上限×各appのプロセス数に、worker、管理、migration、入替中の旧新app分を加えて接続予算を置く。pool上限は常時接続数とは限らない。たとえば1プロセスのappが10台で各20接続なら最大200、30台なら600となる。各poolを小さくしても台数が無制限なら総数を固定できない。

poolは接続確立コストを再利用し、同時DB利用を制限する。小さすぎるとpool待ち、大きすぎるとDB側の競合が増える。read replicaはreadの分散先を作り、shardingはデータを分ける設計であり、接続枯渇の原因確認前に追加すると運用・整合性の負担が増える。

Connection・transaction・network往復は別の境界

Section titled “Connection・transaction・network往復は別の境界”

時系列図は、逐次awaitする一般的なclientの例。poolから借りるのはapp内の操作であり、空き接続を再利用できれば新しいTCP接続を張らない。同じDB sessionへBEGIN、query A、query B、COMMITを順に送り、それぞれの応答を待つ。COMMIT後も返却までconnectionを保持し、poolへの返却でTCPが必ず切れるわけではない。

transactionを一回のnetwork requestと同一視しない。一方で「SQL一文=必ず一往復」でもない。複数文を一つのQueryメッセージに含める方法やpipelineがある。図は全driver共通のpacket数を表さない。PostgreSQL 18 protocol flow

node-postgresならtransactionの全statementに同じclientを使い、成功時COMMIT、失敗時ROLLBACKを試み、finallyで返却する。壊れた接続はpoolへ正常接続として戻さない。各statementを別々のpool.queryに任せると同じtransactionを維持できない。node-postgres Transactions

Why:長い外部I/OをDB占有から外す

Section titled “Why:長い外部I/OをDB占有から外す”
設計例 Connectionの保持と障害時の意味
悪例:借用→BEGIN→注文更新→決済APIを500ms待つ→COMMIT→返却 外部待ち中も接続と取得済みlockを保持。DB rollbackで決済は取り消せない
改善例:短いtransactionでpendingをcommit→返却→決済→短いtransactionで結果更新→返却 決済待ちにDB接続は不要。ただし途中停止を回収するworkerと照合が必要

前段で永続的な仕事IDと状態を残し、同じ業務操作には同じprovider idempotency keyを使う。決済成功直後の停止は「失敗」と断定せず照会・再試行で確認する。詳細は外部副作用・Outboxの解説決済APIの再試行契約を再利用する。単にtransactionを二分しただけで処理完了は保証されない。

pool待ちが増えたら、借用から返却までのhold timeを計測し、その内訳をquery実行、lock待ち、外部I/O、アプリ内処理、返却漏れへ分解する。DBのquery開始時刻、transaction開始時刻、state、wait eventを照合する。DBのCPUが低くても、idle in transactionやlock待ちは残り得る。app側pool待ちはDB統計だけでは見えない。PostgreSQL 18 monitoring

Trade-off:速度・占有・優先順位・分離を組み合わせる

Section titled “Trade-off:速度・占有・優先順位・分離を組み合わせる”
手段 制御する対象 利点と限界
tenant rate limit 単位時間の受付・送信量 一顧客の急増を抑える。burst allowanceがなければ正当な短期需要も拒否
quota 割当上限。件数・容量・同時数・速度など、定義による queue未完了件数の上限なら占有を抑える。期間と単位とscopeの明記が必要
priority / weighted scheduling 仕事を処理する順序・配分 strict priorityは低優先度を飢餓にし得る。最低配分を設けても総capacityは増えない
tenant isolation queue・worker・接続等の境界 障害影響を限定。専用資源はコスト・低稼働時の無駄・管理数が増える

「rate limit=速度、quota=総量」は一つのAPIの説明としては便利でも、AWS全体の定義ではない。AWSのquotaにはresource数のほか操作上限もあり、API GatewayにはRPSのthrottle quotaがある。何を・誰に・どの期間・どの強制方式で制限するかを確認する。AWS Service QuotasAPI Gateway quotas

演習上の追加条件として、tenantごと100/s補充・bucket容量200件のtoken bucketと、queued+in-flightの未完了最大1,000件を併用する。満杯bucketなら一時200件を受けられるが、未完了が1,000件なら新規受付を拒否または合意済みの別契約へ送る。受付と占有数更新は並行requestでも上限を守る必要がある。件数だけでは巨大payloadを抑えられず、byte数・実処理コストの制限も検討する。これは独自サービスの設計例で、SQSの標準機能としてtenant quotaが提供されるという意味ではない。

Exception:常設queue・予測スケール・同期応答を要件で選ぶ

Section titled “Exception:常設queue・予測スケール・同期応答を要件で選ぶ”

予測可能なburstはwarm-upを見込んだscheduled scalingが候補だが、時刻ずれと下流上限は残る。数分以内の完了でよければ常設queueで平準化できる。ただし受付成功と処理完了は別であり、通常時にbacklogが小さくても同期の完了保証にはならない。状態照会や完了通知を含むAPI契約を決める。

429でconsumerを増やすと下流をさらに圧迫する。全consumer合計の送信rate・concurrencyを制限し、backoffとjitter、retry budgetで再試行の増幅を抑える。DLQは調査・再投入のためであり、容量不足の恒常的な逃がし先にしない。best effortを受けるなら受付時から契約・資源配分を分け、保証対象と同じFIFOの前方へ大量投入してSLOを壊さない。Google SRE overload

Capacity:まずdeadlineの起点を決める

Section titled “Capacity:まずdeadlineの起点を決める”

以下は空queue、一定処理能力、1件につき外部APIを1回、retry・障害なし、FIFOの流体近似。外部上限1,000 req/sを実効1,000 msg/sとして使えるという演習上の追加条件である。本番では他consumer、retry、API応答時間を考慮した余裕が必要。

burstの到着率をλ、処理率をμ、継続をT秒とすると、λがμを上回る間の終了時backlogは B = (λ − μ) × T。後続到着率をλ₀とすると、queue全体が空になる追加時間は B / (μ − λ₀)(λ₀がμ未満)。λ₀がμ以上ならそのままでは解消しない。

時系列図と次の区別を確認する。

演習条件 結果
5,000/sが10秒、処理1,000/s t=10で40,000件
t=10以降、到着ゼロ 追加40秒、t=50でqueueが空
t=10以降、通常500/sへ戻る 純減500/s、追加80秒、t=90でqueueが空
同じ500/s継続でもFIFOのburst分だけを見る 後続は後ろに並ぶためburst分はt=50で完了。queue全体の解消とは違う

burstの完了と、queue全体の解消を分けて見る

Section titled “burstの完了と、queue全体の解消を分けて見る”

既存の時系列図は到着率が変わる時刻を追う。次の図は、同じ10秒burstの例で待っている仕事の内訳を追う。橙はburst中に来た仕事、青はt=10以降に500/sで到着する仕事。棒の長さは待機件数に比例し、空白は容量上限を意味しない。

10秒ではburst4万件、50秒ではburst完了だが通常到着2万件が残り、90秒で滞留が解消する。

図を拡大する

t=10から50の40秒で、処理能力1,000/sは先に来たburstの残り40,000件を処理する。その間に通常の仕事が 500 × 40 = 20,000件 到着して後ろに並ぶ。そのためburstを処理し終えても、queueは空にならない。以後は純減500/sなので、さらに40秒かかる。

図は上の演習条件からの計算で、処理時間・障害・再配送を省いた流体近似である。実システムのSQS Standardに厳密なFIFO順序を仮定する意味ではない。「どの集団を、いつまでに終えるか」を決めてから、次のSLOの式を選ぶ。

「60秒SLO」は起点・対象・達成割合が必要。λ=5,000/s、T=30秒、μ=1,000/sなら15万件を受け、t=30で12万件残り、burst末尾はt=150頃完了する。

  • 全burst分を開始から60秒までに完了λT ≤ μ×60 より、許容λは最大2,000/s。
  • 各messageを到着から60秒以内に完了:末尾の待ちを近似すると (λ−μ)T/μ ≤ 60、許容λは約3,000/s。t=30の末尾をt=90までに処理する計算。個別処理時間・ばらつきの余裕を別途引く。
  • queue全体をburst終了後60秒で空にする、通常500/s継続(λ−1,000)×30 ≤ (1,000−500)×60 より最大2,000/s。

元セッションの6万件という総量と約3,000/sという説明は、同じdeadlineを使った式ではない。SLO起点は元記録でunknownのため、これらを単一の正解として覚えない。上式は仮定からの算出で、実測の保証値ではない。percentile SLOなら全件保証とも区別し、業務の許容遅延・失敗率からadmission controlとpage条件を決める。

Production:capacityを固定してloadを増やす

Section titled “Production:capacityを固定してloadを増やす”

負荷とcapacityの図は曲線の屈曲前後を段階点で示す概念図で、実測曲線ではない。

固定するのはapp台数・instance種類、pool/worker設定、コード・DB schema/index、データ量・分布、request mix・payload、cacheの条件、外部依存先の上限。まず通常負荷の安定を確認し、投入RPSを段階的に増やして各段階で滞留の成長も見る。その後、一つの資源だけ変えて同じ試験を比較する。autoscalingを含む追従試験は別の目的としてwarm-up・overshoot・復旧を測る。Grafana k6 stress testing

投入RPS(演習値) 成功完了RPS(追加の仮定) p99(演習値) 解釈
1,000 1,000 200ms 安定段階の例
2,000 2,000 300ms ここまでは追従する例
2,500 2,200 1,500ms throughputの伸びが鈍り待ちが増える例

元セッションでthroughputの実測はない。上表の完了RPSは曲線説明用に追加した値。投入が完了を上回る差は未完了・拒否等へ行くので、error 0%でも短時間観測ならbacklogが成長し得る。CPU70%だけで余裕と断定しない。p99急増はknee候補で、2点だけで正確な限界を確定せず、その間を細かく測る。許容capacityはSLOを満たす持続可能な点に運用余裕を残して決める。

Troubleshooting:ユーザーの遅延から待ちの場所へ

Section titled “Troubleshooting:ユーザーの遅延から待ちの場所へ”
  1. 同じ時間窓で投入・受付・成功完了RPS、p50/p95/p99、timeout/error、未完了数を確認する。負荷生成器のCPU/networkや送信不足も確認する。応答待ちで投入が勝手に下がるモデルなら、狙った到着率が出ているか検証する。
  2. trace等でapp待ち、pool待ち、SQL、外部APIの時間を分け、pool active/idle/wait、hold timeとDB wait eventを照合する。
  3. CPU/memory、network、disk I/O、DB connection・lock・query latencyを追い、最も増えた待ちの原因を絞る。単一指標だけでI/O-boundと確定しない。
  4. queueではdepth・oldest age・受信/削除・retry・DLQ・tenant別遅延を見る。oldest timestampの前進はヒントだがpoison messageと能力不足の確定診断にはならない。SQS Standardのage指標は繰り返し失敗messageを除外する場合があり、再配送やDLQ移動も値を変える。SQS metrics
  5. 対策を一つ変更し、同条件でSLOと下流負荷を再確認する。queue ageのpage閾値は処理完了SLOから検知・対応・残処理時間を引いて設計する。

2026-09-08-architecture-scaling-01Issue #10)の追加質問4件:connectionの通信境界、quotaと公平性、backlogとdeadline、負荷試験の固定条件。一次資料は各節に記載。図JSONは diagrams/architecture-scaling/ が正本。SQLや負荷試験は今回実行しておらず、教材の整備を本人の実績へ加えていない。

図表改善(2026-09-09):説明用SVGはSVG自体が正本。前提と判断は本文、状態・比較は図、通信順序・依存関係は既存図、実測は元の記録を参照する。教材編集を新しい学習実績にはしない。