wan0ri Lab

大規模システム設計の基礎 を視聴して【イベント感想】

TL;DR

  • システム設計は「要件・制約 → 規模見積もり → ボトルネック仮説 → 対策/検証」の反復。言語化した前提を常に更新するのが肝。
  • 規模感は“目分量”ではなく、概算(QPS Queries Per Second。1 秒あたりに処理するリクエスト数。システム規模を見積もる基本指標。 / スループット 単位時間あたりに処理できる量(件数・データ量)。処理能力の指標。 / ストレージ容量 / 帯域 1 秒あたりに送受信できるデータ量。ネットワークの太さの指標。 )で会話する。数字があると優先順位とトレードオフが立つ。
  • スケール戦略は段階的に(垂直 1 台あたりの CPU/メモリ/IO を増やす拡張。シンプルだが上限がある。 → 水平 台数を増やして負荷を分散。運用は複雑になるが上限が高い。 → 分割 機能やデータを小さな単位に分ける(サービス分割/パーティショニング)。 )。キャッシュ 繰り返し使う結果を一時保存し、読み出しを速くする仕組み。 、非同期化 応答を待たずに裏で処理する設計(ピーク平準化)。 、キュー 要求を一時的に貯めて順次処理するバッファ。スパイク吸収に有効。 、シャーディング データを複数分割(シャード)に分けて並列処理/分散。 、冪等性 同じ操作を何度実行しても最終結果が変わらない性質。 で詰まりを逃がす。
  • 可用性 システムが利用可能な時間の割合(例: 99.9%)。 ・一貫性 複数の副本やサービス間で“同じ事実”を同時に見られる度合い。 ・コスト・複雑性はトレードオフ。SLO Service Level Objective。ユーザー体験の“目標品質”。 を置き、過不足を検証で詰める。

参加イベント

2025 年 11 月 29 日(土)に開催された Recursion 主催の『大規模システム設計の基礎』を視聴しました。

備考: 当日 Zoom のチャットで登壇者様より参加者向け URL として資料共有がありましたが、connpass には一般公開されていないため、本記事では資料 URL/内容の直接掲載や図版の転載は行いません(要旨のみ記載)。


印象に残ったこと

1. 前提をそろえる(要件/制約/成功条件)

機能要件(誰が何をいつまでに)と非機能要件(可用性/レイテンシ リクエスト往復の遅延時間。p95 など分位で評価。 /スループット/保存期間/費用上限)を先に言語化。
「SLO と完了定義」があると、後段のトレードオフや優先順位の会話が速くなると実感しました。

2. 概算でスケールを掴む(Back-of-the-envelope)

Back-of-the-envelope とは、封筒の裏計算。厳密さよりも“桁”を素早く掴む概算のこと。

リクエスト/秒、平均レスポンス、書き込み/読み出し比 Write/Read Ratio。書込と読取の比率。キャッシュや DB 設計の判断材料。 、データ増分、帯域、ストレージ費をざっくりで良いので置く。
数字が置けると、キャッシュの利き所、DB/ネットワークの詰まり、ボトルネック 全体性能を支配する最も遅い箇所。 候補が自然と見えてきます。

3. ボトルネックに対する基本手筋

  • キャッシュ(ブラウザ/エッジ CDN などユーザー近くの層で応答する仕組み。 /アプリ/DB 前)でホットパス 最も頻繁に通る主要経路。最適化の優先度が高い。 を軽くする。
  • 非同期化(キュー/ワーカー キューから取り出して処理するバックグラウンド実行体。 、リトライ 一時失敗時に再実行する制御。回数/間隔/上限を設計。 とバックオフ 再試行間隔を段階的に伸ばす戦略(指数バックオフなど)。 )でピークを平準化。
  • シャーディング/レプリケーション 同一データの複製を複数ノードに配置し可用性/読み取り性能を高める手法。 で水平分割。ハッシュ キーをハッシュ関数で数値化して均等に分散する方式。 or レンジ 値の範囲(例: A〜F)ごとに分ける方式。ホットレンジに注意。 の選択とスキュー アクセスやデータが特定シャードに偏ること。検知と再分割が必要。 対策。
  • 冪等性キー 重複実行を識別する一意キー。処理済み検知で二重適用を防ぐ。 と順序保証 イベント/メッセージの処理順を維持する仕組み(例: パーティション内順序)。 、バックプレッシャー 下流能力に合わせて上流の受け付けを抑制する制御。輻輳防止。 で故障時の増幅を抑える。

4. 一貫性と可用性の折り合い

ユーザー体験の SLO を軸に、強い整合性 書き込み直後でも全読取りで同じ値が見える性質。直感的だがスケールは難しい。 /最終的整合性 時間経過で整合することを許容。可用性とスケールを取りやすい。 、厳密なトランザクション ACID を満たす不可分な操作単位。分散では難度/コスト増。 /アウトボックス+イベント駆動 DB のアウトボックスにイベントを書き、別プロセスで配信するパターン。二相問題を回避しやすい。 などの選択肢を評価。
“理想”ではなく“必要十分”を合意して進めるのが現実的だと再確認しました。

5. 運用と検証まで含めて設計

観測可能性 内側の状態を外から推測できる性質。メトリクス/ログ/トレースの組み合わせ。 (メトリクス 数値で継続計測する指標(RPS、p95、エラー率など)。 /ログ/トレース 分散処理の経路を関連付けて可視化する仕組み(OpenTelemetry 等)。 )とローリング 少数ずつ順に置き換えるデプロイ方式。影響を限定。 /カナリア 一部トラフィックのみに新バージョンを適用する実験的リリース。 /段階リリース、容量監視、スロットリング 受け付け量を動的に絞る制御。過負荷や連鎖障害を防ぐ。 /レート制限 クライアント単位で一定時間あたりの呼び出し回数を制限。濫用防止。 を最初から設計に入れる。
設計レビューは “図と言葉と数字” の 3 点セットで回すと意思疎通が早い。


後に試してみたいこと (自分向け)

  • 設計ワンペーパーを定着: 前提/概算/リスク/実験計画の 1 枚を作ってから実装に入る。
  • 概算テンプレの自動化: QPS・保存量・帯域を計算する簡易シートを用意して、レビューで使い回す。
  • 失敗前提の設計チェック: タイムアウト 上限時間を超えた処理を打ち切る制御。 /リトライ/冪等性/バックオフ/サーキットブレーカ 下流の失敗率が高いとき回路を開いて呼び出しを止め、回復後に半開で試行するパターン。 の有無を点検。
  • 観測の最小セット: 成功率、p95 全リクエストの 95% がこの値以下で終わるという分位(パーセンタイル)。 レイテンシ、エラー率、キュー滞留、リソース使用率を最初からダッシュボード化。
System Design ワンペーパー(雛形・コピペ可)
## 背景/目的

- 目的: <例: 注文 API を 300 RPS で p95 300ms 以内に>
- ユーザー価値: <例: カート離脱を抑える>

## 前提/制約

- SLO: 可用性 99.9% / p95 300ms / 28 日
- 制約: <リージョン/既存 DB/予算上限/発売日 など>

## 概算(Back-of-the-envelope)

- トラフィック: ピーク <RPS> / 日次 <リクエスト数>
- データ: 書込/読取比、1 リクエストあたりのペイロード、日次増分
- 帯域/費用: 出入口 <MB/s>、ストレージ/月 <GB>

## アーキテクチャ(初期案)

- パス: <同期> API Gateway → App → Cache → DB
- バックグラウンド: <非同期> Queue → Worker → 外部連携
- 信頼性: Retry(指数)/Timeout/Idempotency/CircuitBreaker/RateLimit

## リスク/対策

- ホットキー/スキュー → キャッシュ分散、キー設計
- キュー滞留 → 可視化、スケールポリシー、DLQ
- DB ボトルネック → 読取レプリカ、セカンダリインデックス

## 実験計画/検証

- 負荷試験: 100→300→500 RPS ステップ、p95/エラー率監視
- カナリア: 5% → 25% → 50% ロールアウト、指標は SLO 直結のみ Pager

まとめ(現時点の所感)

数字で前提を固定し、小さく検証して学びを反映する ── この当たり前を“儀式化”すると組織の設計力が底上げされると感じました。
まずはワンペーパー 設計の要点を 1 枚にまとめた資料。前提/概算/リスク/検証を簡潔に記す。 と概算テンプレをチームで共有し、レビューの共通フォーマットにしていきます。

SRE は “定義 → 運用 → 学習” のリズムを組織で回す営みだと再確認しました。
まずは自チームの SLO を 3 件に絞り、アラートの棚卸しと PIR Post-Incident Review。事後レビュー。非難なく、タイムライン/影響/恒久対策を言語化する振り返り。 のテンプレ整備から着手したいと思います。なお Pager “人を起こす”レベルの緊急通知(例: PagerDuty)。SLO 直結のみを対象にするのが原則。 方針を徹底することも心がけたいと思います。