EXERCISE 90分

ストーリー

佐藤CTO
これがMonth 1の集大成だ
佐藤CTO
新規SaaSプラットフォームのアーキテクチャを一から設計し、設計レビューを通過してほしい。これまで学んだすべてを使う時だ

シナリオ

企業: HRテック企業「TalentHub」
事業: 中小企業向けクラウド人事管理SaaS
要件:
  - マルチテナント対応(1000社、従業員数合計50万人)
  - 勤怠管理、給与計算、人事評価、採用管理
  - 月次の給与計算バッチ(締め日に集中)
  - モバイルからの勤怠打刻
  - 年末調整時にピーク(通常の5倍)
  - 個人情報保護法対応
  - 99.9%可用性(給与計算日は99.99%)

Part 1: 品質属性の定義(15分)

これまでのStep 2で学んだ手法を使い、TalentHubの非機能要件を定義してください。

  • パフォーマンス要件(主要操作のSLA)
  • スケーラビリティ要件(テナント数・従業員数の成長対応)
  • 可用性要件(通常時と給与計算日)
  • セキュリティ要件(個人情報保護)
解答例
カテゴリ要件
パフォーマンス勤怠打刻: p95 < 200ms、給与計算: 1000人分を10分以内
スケーラビリティテナント1000社→5000社対応、従業員50万→200万対応
可用性通常: 99.9%、給与計算日: 99.99%
セキュリティ個人情報暗号化、テナント間データ分離、監査ログ

Part 2: アーキテクチャスタイルの選択(15分)

Step 3の知識を活かし、最適なアーキテクチャスタイルを選択してください。

  • モノリス、モジュラーモノリス、マイクロサービスのいずれか
  • 通信パターン(同期/非同期)
  • データアーキテクチャ(単一DB/DB per Service/CQRS)
解答例

推奨: モジュラーモノリス + CQRS(給与計算のみ非同期)

理由:

  • 中小企業向けSaaSでチーム規模が限定的→モジュラーモノリスが適切
  • 給与計算はバッチ処理で非同期キュー使用
  • 読み取り(勤怠確認)と書き込み(打刻)の比率が高いためCQRS有効
  • マルチテナント: 共有DB + Row Level Security

Part 3: トレードオフ分析とADR(20分)

Step 4の手法を使い、主要な設計判断のトレードオフを分析し、ADRを2つ作成してください。

解答例
# ADR-001: マルチテナント方式として共有DB + RLSを採用

## ステータス
承認済

## コンテキスト
1000テナントのデータ分離方式を決定する必要がある。

## 検討した選択肢
1. テナントごとにDB分離
2. テナントごとにスキーマ分離
3. 共有DB + Row Level Security

## 決定
共有DB + RLSを採用する。

## 理由
- 1000テナントで個別DB管理は運用コストが過大
- RLSによりDB層でデータ分離を強制可能
- マイグレーションが1回で済む

## 結果
- メリット: 運用シンプル、コスト効率
- デメリット: テナント間の干渉リスク(ノイジーネイバー)
# ADR-002: 給与計算をイベント駆動バッチとして実装

## ステータス
承認済

## コンテキスト
月次給与計算は大量データ処理が必要で、締め日に集中する。

## 決定
給与計算をKafkaベースの非同期バッチ処理として実装する。

## 理由
- 同期処理ではタイムアウトリスクが高い
- テナントごとに独立してスケール可能
- 失敗時のリトライが容易

Part 4: C4図と技術スタック(20分)

Step 5の手法を使い、C4図(Level 1 + Level 2)と技術スタック選定表を作成してください。

解答例

Level 2 Container:

フロントエンド:
  - Next.js(管理画面)
  - React Native(モバイル打刻アプリ)

バックエンド(モジュラーモノリス):
  - NestJS
    ├── 勤怠モジュール
    ├── 給与計算モジュール
    ├── 人事評価モジュール
    └── 採用管理モジュール

データ:
  - PostgreSQL + RLS(メインDB)
  - Redis(セッション、キャッシュ)
  - Kafka(給与計算キュー)

インフラ:
  - AWS ECS Fargate
  - CloudFront + S3

Part 5: 設計レビュー質疑応答(20分)

以下のステークホルダーからの質問に回答してください。

CTO: 「なぜマイクロサービスにしないの?将来的に困らない?」

セキュリティ担当: 「テナント間のデータ分離は本当に大丈夫?」

インフラチーム: 「給与計算のピーク時にインフラは耐えられる?」

プロダクトマネージャー: 「新機能追加のリードタイムは今より短くなる?」

解答例

CTO回答: モジュラーモノリスは明確なモジュール境界を持つため、将来的なマイクロサービス分離の基盤になります。現在のチーム規模ではマイクロサービスの運用コストが高すぎます。テナント数5000社超の段階で分離を検討します(ADR参照)。

セキュリティ回答: PostgreSQLのRow Level Securityにより、DB層でテナント分離を強制します。アプリケーション層のバグでもRLSが防御線となります。さらに定期的な侵入テストでRLS設定を検証します。

インフラ回答: 給与計算はKafkaベースの非同期バッチで、テナント単位でスケール可能です。ECS Fargateのオートスケーリングでワーカー数を動的に調整します。事前に負荷テストで検証します。

PM回答: モジュール境界が明確になることで、チームごとの独立した開発が可能になります。現状のモノリスよりリードタイムは短縮されます。具体的には、CI/CDの整備と合わせて現在の2週間→1週間を目標にします。


まとめ

ポイント内容
品質属性定量的に要件を定義する
スタイル選択チーム・ビジネスに合った選択をする
トレードオフADRで判断と根拠を記録する
レビューステークホルダーの質問に答えられる設計書を書く

チェックリスト

  • 品質属性を定量的に定義できた
  • アーキテクチャスタイルを根拠を持って選択できた
  • トレードオフ分析とADRを作成できた
  • C4図と技術スタックを記述できた
  • ステークホルダーの質問に回答できた

次のステップへ

最後は卒業クイズです。Month 1の全体を振り返りましょう。


推定読了時間: 90分