Appearance
インフラ設計
概要
高速化を実現するための7層アーキテクチャを採用し、各層が連携してレスポンス時間200ms以下を実現します。
環境一覧
| 環境 | 用途 | URL / 接続先 |
|---|---|---|
| 開発環境 | 開発・動作確認 | localhost:3000 |
| ステージング環境 | 検証・テスト | stg.mtg-deck.example.com |
| 本番環境 | 運用 | mtg-deck.example.com |
システム構成図
mermaid
graph TB
subgraph "1️⃣ CDN Layer"
CF[Cloudflare<br>Brotli圧縮・HTTP/3<br>DDoS保護・WAF]
end
subgraph "2️⃣ Frontend Layer"
Next[Next.js 14<br>App Router + PPR<br>Image最適化]
end
subgraph "3️⃣ API Layer"
tRPC[tRPC<br>Edge Functions<br>型安全API]
end
subgraph "4️⃣ Cache Layer"
Redis[(Redis/Upstash<br>3段階キャッシュ)]
end
subgraph "5️⃣ Search Layer"
Algolia[(Algolia<br>瞬間検索)]
end
subgraph "6️⃣ AI Layer"
LLM[GPT-4/Claude]
Pinecone[(Pinecone<br>Vector DB)]
end
subgraph "7️⃣ Data Layer"
DB[(PostgreSQL<br>Supabase)]
External[外部API<br>TCGPlayer/Hareruya<br>Scryfall/MTGTOP8]
Storage[Cloudinary<br>画像ストレージ]
end
User[ユーザー] --> CF
CF --> Next
Next --> tRPC
tRPC --> Redis
tRPC --> Algolia
tRPC --> LLM
LLM --> Pinecone
tRPC --> DB
tRPC --> External
tRPC --> Storage7層アーキテクチャ詳細
1️⃣ CDN Layer (Cloudflare)
役割: 全世界への高速コンテンツ配信
| 機能 | 詳細 |
|---|---|
| 圧縮 | Brotli圧縮(gzip比30%軽量) |
| プロトコル | HTTP/3(QUIC) |
| 最適化 | Auto Minify(HTML/CSS/JS) |
| セキュリティ | DDoS保護、WAF、レート制限 |
キャッシュ戦略:
| コンテンツ | TTL |
|---|---|
| 静的アセット | 30日 |
| API レスポンス | 5分 |
| 画像 | 7日 |
2️⃣ Frontend Layer (Next.js 14)
役割: 超高速なユーザーインターフェース
| 技術 | 用途 |
|---|---|
| App Router | ファイルベースルーティング |
| PPR | Partial Prerendering |
| Image最適化 | AVIF/WebP自動変換 |
| Bundle分割 | Tree Shaking |
| Service Worker | PWA対応 |
状態管理:
| ライブラリ | 担当 |
|---|---|
| Zustand | グローバル状態(ユーザー、デッキ、UI) |
| React Query | サーバー状態 + 自動キャッシュ |
| Framer Motion | 60FPSアニメーション |
3️⃣ API Layer (tRPC + Edge Functions)
役割: 型安全な高速API
| 特徴 | 詳細 |
|---|---|
| ランタイム | Edge Runtime(Vercel Edge) |
| 分散配置 | 東京 / サンフランシスコ / フランクフルト |
| 型安全 | 自動型生成でランタイムエラー0 |
4️⃣ Cache Layer (Redis/Upstash)
役割: 超高速データアクセス
3段階キャッシュ戦略:
| 層 | データ | TTL |
|---|---|---|
| Hot Data | ユーザーセッション | 24時間 |
| Hot Data | 人気カード | 1時間 |
| Warm Data | カード詳細 | 6時間 |
| Warm Data | デッキ統計 | 1時間 |
| Cold Data | 検索結果 | 5分 |
| Cold Data | 価格履歴 | 1時間 |
5️⃣ Search Layer (Algolia)
役割: 瞬間カード検索
| 項目 | 詳細 |
|---|---|
| 検索速度 | 平均50ms以下 |
| インデックス | カード名、テキスト、タイプ |
| ファセット | 色、マナコスト、フォーマット |
| 検索機能 | タイポ許容、シノニム |
6️⃣ AI Layer
役割: インテリジェントなコンボ・メタ分析
| コンポーネント | 用途 |
|---|---|
| GPT-4 / Claude | 自然言語でのデッキ相談、改善提案 |
| Pinecone | ベクトル検索によるカード類似度計算 |
AI機能:
- リアルタイムコンボ提案
- メタゲーム分析
- デッキ強化提案
- 自然言語Q&A
7️⃣ Data Layer
役割: 堅牢なデータ管理
| コンポーネント | 用途 |
|---|---|
| PostgreSQL (Supabase) | メインDB、リアルタイム同期 |
| Cloudinary | 画像ストレージ、変換 |
外部API連携:
| API | 用途 |
|---|---|
| Scryfall | カード情報、画像 |
| TCGPlayer | 米国価格 |
| Hareruya | 日本価格 |
| MTGTOP8 | 大会結果 |
データフロー例:カード検索
mermaid
sequenceDiagram
participant User as ユーザー
participant CDN as Cloudflare
participant FE as Next.js
participant API as tRPC
participant Cache as Redis
participant Search as Algolia
User->>CDN: 検索入力
CDN->>FE: リクエスト転送
FE->>FE: Debounce (300ms)
FE->>API: 検索クエリ
API->>Cache: キャッシュ確認 (5ms)
alt キャッシュヒット
Cache-->>API: 結果返却
else キャッシュミス
API->>Search: Algolia検索 (50ms)
Search-->>API: 検索結果
API->>Cache: 結果キャッシュ
end
API-->>FE: レスポンス
FE-->>CDN: HTML/JSON
CDN-->>User: 画面表示
Note over User,CDN: 総時間 < 100msパフォーマンス指標
| 項目 | 目標値 | 測定方法 |
|---|---|---|
| 初回ロード | < 1.5秒 | Lighthouse |
| ページ遷移 | < 0.3秒 | Core Web Vitals |
| カード検索 | < 100ms | Algolia Analytics |
| API応答 | < 200ms | Vercel Analytics |
| 画像読込 | < 500ms | Real User Monitoring |
監視・アラート
| ツール | 用途 |
|---|---|
| Vercel Analytics | パフォーマンス監視 |
| Sentry | エラートラッキング |
| Upstash Console | Redisモニタリング |
| Supabase Dashboard | DB監視 |
スケーリング戦略
| 層 | 戦略 |
|---|---|
| CDN | 自動スケール(Cloudflare) |
| Frontend | サーバーレス自動スケール(Vercel) |
| API | Edge Functions 自動スケール |
| Cache | Redis Cluster 自動スケール(Upstash) |
| DB | Connection Pooling + Read Replica |