パフォーマンス要件
Bazbiiシステムのパフォーマンス目標とベンチマークを説明します。
パフォーマンス要件の概要
パフォーマンス目標
システム全体で以下のパフォーマンス目標を設定:
- レスポンスタイム: P95で200ms以下
- スループット: 1000 req/s以上
- 可用性: 99.9%以上(月間43分以下のダウンタイム)
APIレスポンスタイム目標
目標値
| API | P50 | P95 | P99 |
|---|---|---|---|
| POST /v1/posts | 50ms | 200ms | 500ms |
| GET /v1/timeline | 100ms | 300ms | 500ms |
| GET /v1/heatmap | 150ms | 400ms | 800ms |
| POST /v1/auth/provision | 100ms | 300ms | 500ms |
測定方法
- メトリクス: Grafana Cloud Prometheus互換エンドポイントで計測
- ダッシュボード: Grafana Cloudで可視化
- アラート: P95が目標値を超過した場合にアラート
スループット目標
目標値
- Gateway: 1000 req/s
- API Server: 500 req/s(gRPC)
- データベース: 1000 qps
負荷テスト
# 負荷テストツール(例: k6)
k6 run load-test.js
# 負荷テストシナリオ
# - レートリミッターを考慮
# - 段階的な負荷増加
# - ピーク時の負荷をシミュレート
リソース使用率
CPU使用率
- 目標: 平均70%以下
- アラート閾値: 平均80%以上、またはピーク90%以上
メモリ使用率
- 目標: 平均70%以下
- アラート閾値: 平均80%以上
データベース接続数
- 目標: 接続プールサイズの70%以下
- アラート閾値: 接続プールサイズの80%以上
パフォーマンス最適化
1. データベースクエリ最適化
インデックス戦略
-- スコア順取得用インデックス
CREATE INDEX idx_posts_score ON posts(score DESC, id DESC);
-- H3インデックスによる地理空間検索
-- (PostGISまたはH3インデックスを使用)
クエリ最適化
- N+1問題の回避: JOINやバッチクエリの使用
- ページネーション: LIMIT/OFFSETの適切な使用
- クエリキャッシュ: 頻繁にアクセスされるデータのキャッシュ
2. アプリケーション層の最適化
並行処理
// goroutineを使用した並行処理
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func(item Item) {
defer wg.Done()
process(item)
}(item)
}
wg.Wait()
キャッシング
- Redis: 頻繁にアクセスされるデータのキャッシュ(将来実装予定)
- アプリケーションキャッシュ: メモリ内キャッシュ
3. ネットワーク最適化
gRPCの使用
- 内部通信はgRPCで効率的な通信
- プロトコルバッファによるシリアライゼーション
CDNの活用
- Cloudflare CDNによる静的コンテンツの配信
- エッジキャッシング
ベンチマークテスト
ベンチマーク環境
- 環境: ステージング環境
- データ量: 本番環境と同等(または縮小版)
- 負荷: 段階的な負荷増加
ベンチマーク項目
- レイテンシ: レスポンスタイム
- スループット: 秒間リクエスト数
- リソース使用率: CPU、メモリ、I/O
- スケーラビリティ: 水平スケーリング時の性能
ベンチマークツール
- k6: HTTP負荷テスト
- Apache Bench (ab): 簡単な負荷テスト
- PostgreSQLベンチマーク: pgbench
ベンチマーク実行例
# k6での負荷テスト
k6 run --vus 100 --duration 30s load-test.js
# 結果の確認
# - レスポンスタイム(P50, P95, P99)
# - スループット
# - エラー率
パフォーマンス監視
メトリクス収集
- Grafana Cloud Prometheus: メトリクス収集(Prometheus互換エンドポイント)
- Grafana Cloud: 可視化
監視項目
- リクエストレイテンシ: ヒストグラム
- エラー率: カウンター
- スループット: レート
- リソース使用率: ゲージ
アラート設定
- レスポンスタイム: P95が目標値の1.5倍を超過
- エラー率: エラー率が1%を超過
- リソース使用率: CPU/メモリが80%を超過
パフォーマンステスト
単体パフォーマンステスト
// Goのベンチマークテスト
func BenchmarkPostService_CreatePost(b *testing.B) {
service := setupTestService()
input := createTestInput()
b.ResetTimer()
for i := 0; i < b.N; i++ {
service.CreatePost(ctx, input)
}
}
統合パフォーマンステスト
- APIのエンドツーエンドテスト: 実際のリクエストフロー
- データベースクエリのテスト: クエリの実行時間
負荷テスト
- 段階的負荷増加: 低負荷から高負荷へ
- ピーク負荷テスト: 予想される最大負荷
- 耐久テスト: 長時間の負荷テスト
スケーリング戦略
水平スケーリング
- Gateway: トラフィックに応じてレプリカ数を増減
- API Server: リクエスト数に応じてレプリカ数を増減
垂直スケーリング
- データベース: CPU/メモリの増強
- アプリケーション: リソース制限の調整
オートスケーリング(将来実装予定)
# Kubernetes HPA設定例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: gateway-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: gateway
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
パフォーマンス改善の継続
定期的なレビュー
- 週次: メトリクスのレビュー
- 月次: パフォーマンストレンドの分析
- 四半期: ベンチマークテストの実行
改善活動
- ボトルネックの特定: プロファイリング
- 最適化の実施: クエリ最適化、アルゴリズム改善
- 再測定: 改善後のベンチマーク
ベストプラクティス
1. 早期のパフォーマンステスト
- 開発の早い段階でパフォーマンステスト
- CI/CDパイプラインに含める(将来)
2. 実測データに基づく判断
- 推測ではなく実測データで判断
- プロファイリングツールの活用
3. 段階的な最適化
- ボトルネックから順に最適化
- 過度な最適化は避ける