ストーリー
田
田中VPoE
言語戦略の次は、アーキテクチャ標準だ。個々のサービスの設計から、サービス間の連携パターンまでを標準化する
あなた
アーキテクチャの標準化って、かなり難しそうですね。チームごとに事情が違うので
あ
田
田中VPoE
その通りだ。だからアーキテクチャ標準は「こう設計しろ」ではなく「この原則に従え」という形にする。原則は統一し、具体的な実装はチームに委ねる。例えば「サービス間通信はAPIを介して行うこと」は原則だが、RESTかgRPCかはチームが判断する
田
田中VPoE
そうだ。アーキテクチャ標準のレベルを3つに分けて設計する
アーキテクチャ標準の3つのレベル
| レベル | 対象 | 例 | 標準化の強さ |
|---|
| 原則(Principles) | 設計の根底にある考え方 | 疎結合、単一責任、APIファースト | Must |
| パターン(Patterns) | 繰り返し使われる設計パターン | マイクロサービス、イベント駆動、CQRS | Should |
| 規約(Conventions) | 具体的な実装ルール | ディレクトリ構造、エラーコード体系 | Should / May |
原則(Principles)
組織が採用すべきアーキテクチャ原則
| 原則 | 内容 | 標準化レベル |
|---|
| APIファースト | サービス間の連携はすべてAPI(REST/gRPC)を介して行う | Must |
| 疎結合 | サービスは他のサービスの内部実装に依存しない | Must |
| データ所有権 | 各サービスは自身のデータストアを所有し、直接DBアクセスを禁止 | Must |
| 環境非依存 | アプリケーションは環境変数で設定を注入し、環境固有のコードを含まない | Must |
| オブザーバビリティ | すべてのサービスは構造化ログ、メトリクス、トレースを出力する | Must |
| フェイルファスト | 異常な状態を検知したら速やかにエラーを返す | Should |
| 冪等性 | APIは可能な限り冪等に設計する | Should |
原則の依存関係:
APIファースト ──→ 疎結合 ──→ データ所有権
│ │
└──→ 環境非依存 └──→ フェイルファスト
│
オブザーバビリティ ←─────────────────────┘
│
冪等性 ←──────────────┘
パターン(Patterns)
サービスアーキテクチャパターン
| パターン | 適用場面 | 推奨度 |
|---|
| モジュラーモノリス | 新規サービスの初期段階 | Adopt |
| マイクロサービス | 十分に境界が明確な独立ドメイン | Adopt |
| イベント駆動 | サービス間の非同期連携 | Trial |
| CQRS | 読み書きの負荷特性が大きく異なる場合 | Trial |
| Saga | 分散トランザクションが必要な場合 | Assess |
サービス内部のアーキテクチャパターン
| パターン | 内容 | 推奨度 |
|---|
| レイヤードアーキテクチャ | Controller → Service → Repository の3層構造 | Adopt |
| ヘキサゴナルアーキテクチャ | ポート&アダプタによる依存性の逆転 | Adopt |
| クリーンアーキテクチャ | ユースケース中心の設計 | Should |
推奨するプロジェクト構造(Go + ヘキサゴナル)
service-name/
├── cmd/
│ └── server/
│ └── main.go # エントリポイント
├── internal/
│ ├── domain/ # ドメイン層
│ │ ├── entity/ # エンティティ
│ │ ├── valueobject/ # 値オブジェクト
│ │ └── port/ # ポート(インターフェース)
│ │ ├── in/ # 入力ポート(ユースケース)
│ │ └── out/ # 出力ポート(リポジトリ等)
│ ├── application/ # アプリケーション層
│ │ └── usecase/ # ユースケース実装
│ └── adapter/ # アダプター層
│ ├── in/ # 入力アダプター(HTTP/gRPC)
│ └── out/ # 出力アダプター(DB/外部API)
├── pkg/ # 公開パッケージ
├── api/ # API定義(OpenAPI/Proto)
├── deployments/ # デプロイ設定
└── docs/ # ドキュメント
規約(Conventions)
API設計規約
| 項目 | 規約 | レベル |
|---|
| バージョニング | URLパスに含める(/v1/users) | Should |
| 命名規則 | リソース名は複数形、スネークケース | Should |
| エラーレスポンス | RFC 7807 (Problem Details) 準拠 | Must |
| ページネーション | カーソルベースを推奨 | Should |
| 認証 | Bearer Token(JWT) | Must |
エラーコード体系
エラーコード体系:
形式: {サービスコード}-{カテゴリ}-{連番}
サービスコード:
├── USR: User Service
├── PRD: Product Service
├── ORD: Order Service
└── NTF: Notification Service
カテゴリ:
├── VAL: Validation Error(400系)
├── AUT: Authentication Error(401)
├── FRB: Forbidden Error(403)
├── NTF: Not Found Error(404)
├── CNF: Conflict Error(409)
└── INT: Internal Error(500系)
例: USR-VAL-001 = User ServiceのValidation Error #001
ログ標準
| 項目 | 標準 | レベル |
|---|
| フォーマット | 構造化JSON | Must |
| 必須フィールド | timestamp, level, message, service, trace_id | Must |
| ログレベル | DEBUG, INFO, WARN, ERROR, FATAL | Must |
| 機密データ | ログにPII・機密データを含めない | Must |
| リクエストログ | 全HTTPリクエストのアクセスログを記録 | Should |
アーキテクチャ標準の適用ガイド
新規サービス vs 既存サービス
| 項目 | 新規サービス | 既存サービス |
|---|
| 原則 | 全原則に準拠 | 段階的に準拠(改修時に対応) |
| パターン | 推奨パターンを採用 | 大規模リファクタリングは不要 |
| 規約 | 規約に完全準拠 | 新規追加コードから準拠 |
「アーキテクチャ標準は”設計図”ではなく”地図”だ。目的地への行き方は複数あるが、どの道を通っても迷わないようにするのが標準の役割だ」 — 田中VPoE
まとめ
| ポイント | 内容 |
|---|
| 3つのレベル | 原則(Principles)、パターン(Patterns)、規約(Conventions) |
| 原則 | APIファースト、疎結合、データ所有権、オブザーバビリティ等 |
| パターン | モジュラーモノリス、マイクロサービス、ヘキサゴナルアーキテクチャ |
| 規約 | API設計、エラーコード、ログフォーマットの具体的な規定 |
チェックリスト
次のステップへ
次は「品質標準とコーディング規約」を学びます。コードの品質を組織全体で底上げするための品質基準とコーディング規約の設計方法を身につけましょう。
推定読了時間: 30分