メインコンテンツまでスキップ

境界と責務

各コンポーネントの境界と、どこまでがその責務かを明確にします。 新しい機能を追加する際の判断基準として使用してください。

Gateway の責務

やるべきこと(境界で価値が出る領域)

1. セキュリティ・防御

  • WAF/ボット対策: Cloudflareと連携した防御
  • レート制限: IP/ユーザー/デバイス単位の精密制御
  • 認証の受け口: JWT検証 → ActorID抽出 → context注入
  • サービス間信頼: Gateway ↔ API間のmTLS

2. プロトコル変換

  • REST ↔ gRPC: Connect RPCによる自動変換
  • ヘッダ正規化: X-Request-Id付与、Accept-Language → locale

3. 横断的関心事

  • 観測の開始: トレース開始、相関ID伝播
  • エラーフォーマット統一: クライアント向けエラー整形
  • A/B・カナリア: トラフィック振り分け

4. レジリエンス

  • サーキットブレーカ: API Serverへの保護
  • タイムアウト標準化: 外部SLAと内部deadlineの切り分け

やらないこと(ドメインは持たない)

  • ❌ ビジネスロジック(投稿作成・権限判定など)
  • ❌ トークンの永続化・セッション管理(APIの責務)
  • ❌ ユーザーデータ更新(DB操作はAPIの責務)
  • ❌ ドメイン検証(最低限の形式チェックのみ、詳細はAPI/core)

API Server の責務

やるべきこと

  • ビジネスロジック実行: ドメインサービス呼び出し
  • データ永続化: Repository経由でのDB操作
  • トークン管理: Refreshトークンの保存・ローテーション
  • ドメインイベント発行: ビジネスイベントの通知
  • 入力バリデーション: 契約・権限・ドメインルールの検証

やらないこと

  • ❌ HTTP/gRPC変換(Gatewayの責務)
  • ❌ 外部認証(Gatewayで検証済み)
  • ❌ レート制限(Gatewayの責務)

server-core の責務

やるべきこと

  • ドメインモデル定義: Entity, Value Object
  • ビジネスルール: ドメインロジック
  • ポート定義: Repository, EventPublisher などのインターフェース
  • ドメインイベント: ビジネスイベントの定義

やらないこと

  • ❌ データベース操作(platformの責務)
  • ❌ HTTP/gRPC処理(appsの責務)
  • ❌ ログ・メトリクス実装(platformの責務)

server-platform の責務

やるべきこと

  • ポート実装: server-coreで定義されたインターフェースの実装
  • インフラ抽象化: DB、ログ、認証の具体実装
  • 観測実装: OpenTelemetry統合

やらないこと

  • ❌ ビジネスロジック(coreの責務)
  • ❌ アプリケーション起動コード(appsの責務)

Cloudflare vs Gateway の分担

Cloudflare(Edge層)

ステートレスで誰にでも同じ判定ができるもの

  • WAF/DDoS/Bot Management
  • IP/ASN/国ベースのレート制限(一次絞り込み)
  • CDNキャッシュ
  • TLS終端

Gateway(Origin層)

アプリ文脈が必要なもの

  • ユーザー/デバイス単位の精密レート制限
  • JWT検証とActorID抽出
  • アプリ固有のA/B・カナリア
  • サービス間信頼(mTLS)

判断基準

新しい機能を追加する際の判断基準:

それはGatewayに置くべきか?

  • ✅ 外部から来る全トラフィックに横断的か?
  • ✅ 境界でしかできない防御・整形・観測か?
  • ✅ データに意味が絡まない(ルーティング、プロトコル変換)か?
  • Yes: Gateway

それはAPIに置くべきか?

  • ✅ ビジネスロジックか?
  • ✅ データの意味・所有権・権限判定が必要か?
  • ✅ 状態遷移が必要か?
  • Yes: API

それはcoreに置くべきか?

  • ✅ ビジネスルールか?
  • ✅ ドメイン知識か?
  • ✅ 技術的詳細を含まないか?
  • Yes: core

それはplatformに置くべきか?

  • ✅ coreで定義されたポートの実装か?
  • ✅ インフラストラクチャの具体化か?
  • ✅ テスト時に差し替え可能にしたいか?
  • Yes: platform

責務チャート

領域GatewayAPIcore
JWT検証(入口)△(内部のみ)
レート制限/CAPTCHA
プロトコル変換
サーキットブレーカ◎(安全範囲のみ)△(下流向け)
観測(開始)◎(RPC内)
ビジネスロジック
データ永続化–(ポート定義のみ)
ポート実装

関連ドキュメント