ストーリー
シナリオ
企業: 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分