# PhotonCloudシステム 設計パターン分析と改善案
## 1. 統合可能性マトリクス
### 1.1 コンポーネント間統合可能性評価
| コンポーネントA | コンポーネントB | 統合可能性 | 理由 | 統合複雑度 |
|---------------|---------------|-----------|------|----------|
| **fiberlb** | **prismnet** | ◎ 高 | 両方ともネットワーク層サービス、L4/L7 LBとVPC/IPAMは補完的 | 中 |
| **fiberlb** | **flashdns** | ◎ 高 | DNSとLBは密接に連携、サービスディスカバリに必須 | 低 |
| **prismnet** | **flashdns** | ○ 中〜高 | VPC内DNS統合は自然だが、責務が異なる | 中 |
| **chainfire** | **flaredb** | △ 中 | 両方ともRocksDB+分散だが、Raft実装とAPIが異なる | 高 |
| **chainfire** | **lightningstor** | × 低 | KVとObject Storageは用途が大きく異なる | - |
| **flaredb** | **lightningstor** | × 低 | SQL DBとObject Storageは統合困難 | - |
| **plasmavmc** | **k8shost** | ○ 中 | 両方ともコンピュート層だが、実装技術が異なる | 高 |
| **iam** | **mtls-agent** | ◎ 高 | 認証・認可とmTLSはセキュリティ基盤として統合可能 | 中 |
| **apigateway** | **fiberlb** | ○ 中 | L7機能の重複あり、統合で一貫性向上 | 中 |
| **creditservice** | **chainfire** | × 不可 | ビジネスロジックとインフラストレージは分離すべき | - |
| **nightlight** | **chainfire** | △ 低 | メトリクスストレージとKVは統合困難 | - |
### 1.2 統合候補グループ
```mermaid
graph TB
subgraph ネットワークサービス統合候補 [ネットワークサービス統合候補]
F[fiberlb
L4/L7 LB]
P[prismnet
VPC/IPAM]
D[flashdns
DNS]
end
subgraph ストレージサービス [ストレージサービス: 統合困難]
C[chainfire
分散KV]
L[flaredb
分散SQL]
S[lightningstor
Object Storage]
end
subgraph コンピュートサービス [コンピュートサービス]
V[plasmavmc
VM管理]
K[k8shost
K8sホスト]
end
subgraph セキュリティ基盤統合候補 [セキュリティ基盤統合候補]
I[iam
認証認可]
M[mtls-agent
mTLS]
end
subgraph 独立サービス [独立サービス]
A[apigateway
API GW]
CS[creditservice
課金]
N[nightlight
監視]
end
F <--> D
P <--> D
F -.->|L7ルーティング| A
```
## 2. 推奨統合案
### 2.1 統合案1: ネットワークサービス統合(fiberlb + prismnet + flashdns)
**統合後名称**: `photonnet`(Photon Network Services)
#### 統合内容
- **core**: 共通ネットワーク型定義、VPC/IPAM基盤
- **lb**: L4/L7ロードバランサー(fiberlbの機能)
- **dns**: 権威DNSサーバー(flashdnsの機能)
- **vpc**: VPCとネットワークセグメント管理(prismnetの機能)
#### 利点
1. **一貫したネットワークポリシー**: VPC、LB、DNSを統一的に管理
2. **サービスディスカバリの統合**: DNSレコードとLBバックエンドの自動連携
3. **設定の一元化**: ネットワーク関連設定の重複排除
4. **相互運用性の向上**: VPC内DNS、LBヘルスチェックの自動DNS更新
#### 欠点とリスク
| リスク | 影響 | 緩和策 |
|-------|------|--------|
| 単一障害点の集中 | 高 | 各サブサービスは独立してデプロイ可能にする |
| 開発速度の低下 | 中 | クレート分割を維持し、インターフェースで疎結合に |
| 既存APIの破壊的変更 | 高 | gRPCサービスは別名で維持し、段階的に移行 |
#### 実装アプローチ
```
photonnet/
├── Cargo.toml # ワークスペースルート
├── crates/
│ ├── photonnet-types/ # 共通型定義
│ ├── photonnet-core/ # VPC/IPAM基盤
│ ├── photonnet-lb/ # ロードバランサー
│ ├── photonnet-dns/ # DNSサーバー
│ └── photonnet-server/ # 統合サーバー
└── proto/
├── vpc.proto
├── lb.proto
└── dns.proto
```
### 2.2 統合案2: セキュリティ基盤統合(iam + mtls-agent)
**統合後名称**: `photonauth`(Photon Auth & Security)
#### 統合内容
- **authn**: 認証サービス(IAMのトークン発行)
- **authz**: 認可・ポリシー評価(IAMの既存機能)
- **mtls**: mTLS証明書管理(mtls-agentの機能)
- **audit**: 監査ログ統合
#### 利点
1. **統一セキュリティポリシー**: 認証、認可、通信暗号化の一元管理
2. **ゼロトラストアーキテクチャ**: サービス間通信の自動mTLS化
3. **証明書とIDの統合**: サービスIDと証明書のライフサイクル管理
#### リスクと緩和策
| リスク | 緩和策 |
|-------|--------|
| IAMの複雑化 | クレート分割を維持、オプション機能として提供 |
| 循環依存 | iam-service-authクレートを共通基盤化 |
### 2.3 統合案3: ストレージサービス(chainfire + flaredb)- 推奨しない
**判断**: 統合しない
**理由**:
1. **異なるRaft実装**: chainfireは独自Raft、flaredbはopenraft
2. **異なるAPIセマンティクス**: KV vs SQL
3. **異なるスケーリング特性**: メタデータKVとデータSQL
4. **統合コストが利益を上回る**
**代替案**: 共通ストレージ基盤ライブラリの共有(後述)
### 2.4 統合案4: コンピュートサービス(plasmavmc + k8shost)- 慎重に検討
**判断**: 部分的統合を検討
#### 統合可能な要素
- **リソーススケジューラ**: VMとK8sのリソース要求を統合キュー
- **ネットワーク統合**: 両方ともprismnet(→photonnet)を使用
- **ストレージ統合**: 両方ともlightningstorを使用
#### 統合しない要素
- **ハイパーバイザー層**: KVMとFirecrackerは分離
- **K8sコントロールプレーン**: 標準K8sを維持
## 3. 共通基盤設計案
### 3.1 photon-common ワークスペース
新しい共通基盤ライブラリ群を作成します。
```
photon-common/
├── Cargo.toml
├── crates/
│ ├── photon-error/ # 共通エラーハンドリング
│ ├── photon-config/ # 設定管理
│ ├── photon-grpc/ # gRPCサービス基盤
│ ├── photon-metrics/ # メトリクス共通
│ ├── photon-storage/ # ストレージ抽象化
│ └── photon-nix/ # NixOSモジュール基盤
```
### 3.2 photon-error: 共通エラーハンドリングライブラリ
```rust
// crates/photon-error/src/lib.rs
use thiserror::Error;
/// PhotonCloud共通エラー型
#[derive(Error, Debug, Clone)]
pub enum PhotonError {
#[error("storage error: {0}")]
Storage(#[from] StorageError),
#[error("network error: {0}")]
Network(#[from] NetworkError),
#[error("consensus error: {0}")]
Consensus(#[from] ConsensusError),
#[error("configuration error: {0}")]
Config(String),
#[error("invalid argument: {0}")]
InvalidArgument(String),
#[error("not found: {0}")]
NotFound(String),
#[error("already exists: {0}")]
AlreadyExists(String),
#[error("permission denied: {0}")]
PermissionDenied(String),
#[error("unauthenticated: {0}")]
Unauthenticated(String),
#[error("timeout: {0}")]
Timeout(String),
#[error("internal error: {0}")]
Internal(String),
}
/// HTTP/gRPCステータスコード変換
trait HttpStatus {
fn http_status(&self) -> u16;
fn grpc_code(&self) -> tonic::Code;
}
pub type PhotonResult = std::result::Result;
```
### 3.3 photon-config: 共通設定管理ライブラリ
```rust
// crates/photon-config/src/lib.rs
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;
use std::path::PathBuf;
/// 全サービス共通の基本設定
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BaseConfig {
/// サービス名
pub service_name: String,
/// ノードID
pub node_id: String,
/// ログレベル
pub log_level: String,
/// メトリクス設定
pub metrics: MetricsConfig,
}
/// ネットワーク設定共通構造
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkConfig {
/// gRPCアドレス
pub grpc_addr: SocketAddr,
/// HTTP/RESTアドレス
pub http_addr: Option,
/// TLS設定
pub tls: Option,
}
/// TLS設定(T027パターン統一)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TlsConfig {
pub cert_file: PathBuf,
pub key_file: PathBuf,
pub ca_file: Option,
#[serde(default)]
pub require_client_cert: bool,
}
/// 設定ローダー
pub struct ConfigLoader {
prefix: String,
_phantom: std::marker::PhantomData,
}
impl ConfigLoader {
pub fn new(prefix: &str) -> Self {
Self {
prefix: prefix.to_string(),
_phantom: std::marker::PhantomData,
}
}
/// config-rsベースの階層的設定読み込み
pub fn load(&self) -> anyhow::Result {
use config::{Config, Environment, File};
Config::builder()
.add_source(File::with_name(&format!("{}", self.prefix)))
.add_source(
Environment::with_prefix(&self.prefix.to_uppercase())
.separator("__")
)
.build()?
.try_deserialize()
.map_err(Into::into)
}
}
```
### 3.4 photon-grpc: 共通gRPCサービス基盤
```rust
// crates/photon-grpc/src/lib.rs
use tonic::transport::Server;
use tonic_health::server::health_reporter;
/// 標準的なgRPCサーバー構築ヘルパー
pub struct GrpcServerBuilder {
service_name: String,
config: NetworkConfig,
}
impl GrpcServerBuilder {
pub fn new(service_name: &str, config: NetworkConfig) -> Self {
Self {
service_name: service_name.to_string(),
config,
}
}
/// ヘルスチェックサービスを追加
pub fn with_health_check(self) -> (Self, HealthReporter) {
let (reporter, service) = health_reporter();
// ...
(self, reporter)
}
/// メトリクスエンドポイントを追加
pub fn with_metrics(self, port: u16) -> Self {
// Prometheusエクスポーター設定
// ...
self
}
/// 認証インターセプターを追加
pub fn with_auth(self, auth_service: Arc) -> Self {
// ...
self
}
/// サーバーを構築
pub async fn build(self) -> anyhow::Result {
// ...
}
}
/// サービス登録マクロ
#[macro_export]
macro_rules! register_service {
($server:expr, $service:ty, $impl:expr) => {
$server.add_service(<$service>::new($impl))
};
}
```
### 3.5 photon-nix: 共通NixOSモジュール基盤
```nix
# crates/photon-nix/lib/service-module.nix
{ config, lib, pkgs, ... }:
with lib;
let
# 共通オプション定義ヘルパー
mkPhotonService = { name, description, defaultPort, extraOptions ? {} }:
{ options, config, ... }:
let cfg = config.services.${name};
in {
options.services.${name} = {
enable = mkEnableOption "${name} service";
nodeId = mkOption {
type = types.str;
default = config.networking.hostName;
description = "Unique node identifier";
};
port = mkOption {
type = types.port;
default = defaultPort;
description = "gRPC service port";
};
dataDir = mkOption {
type = types.path;
default = "/var/lib/${name}";
description = "Data directory";
};
package = mkOption {
type = types.package;
default = pkgs.${name};
description = "Package to use";
};
# 追加オプションをマージ
} // extraOptions;
config = mkIf cfg.enable {
# 共通ユーザー設定
users.users.${name} = {
isSystemUser = true;
group = name;
home = cfg.dataDir;
};
users.groups.${name} = {};
# 共通systemd設定
systemd.services.${name} = {
description = "${description}";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
Type = "simple";
User = name;
Group = name;
Restart = "on-failure";
RestartSec = "10s";
StateDirectory = name;
NoNewPrivileges = true;
PrivateTmp = true;
ProtectSystem = "strict";
ProtectHome = true;
ReadWritePaths = [ cfg.dataDir ];
};
};
};
};
in {
inherit mkPhotonService;
}
```
## 4. ワークスペース再設計案
### 4.1 推奨ディレクトリ構造
```
/home/centra/cloud/
├── Cargo.toml # ルートワークスペース
├── photon-common/ # 新規: 共通基盤
│ ├── Cargo.toml
│ └── crates/
│ ├── photon-error/
│ ├── photon-config/
│ ├── photon-grpc/
│ ├── photon-metrics/
│ ├── photon-storage/
│ └── photon-nix/
│
├── photonnet/ # 統合: fiberlb + prismnet + flashdns
│ ├── Cargo.toml
│ └── crates/
│ ├── photonnet-types/
│ ├── photonnet-core/
│ ├── photonnet-lb/
│ ├── photonnet-dns/
│ └── photonnet-server/
│
├── photonauth/ # 統合: iam + mtls-agent
│ ├── Cargo.toml
│ └── crates/
│ ├── photonauth-types/
│ ├── photonauth-authn/
│ ├── photonauth-authz/
│ ├── photonauth-mtls/
│ ├── photonauth-audit/
│ └── photonauth-server/
│
├── chainfire/ # 既存(依存関係のみ更新)
│ └── ...
│
├── flaredb/ # 既存(依存関係のみ更新)
│ └── ...
│
├── lightningstor/ # 既存(依存関係のみ更新)
│ └── ...
│
├── plasmavmc/ # 既存(依存関係のみ更新)
│ └── ...
│
├── k8shost/ # 既存(依存関係のみ更新)
│ └── ...
│
├── apigateway/ # 既存(依存関係のみ更新)
│ └── ...
│
├── creditservice/ # 既存(依存関係のみ更新)
│ └── ...
│
├── nightlight/ # 既存(依存関係のみ更新)
│ └── ...
│
└── nix/
└── modules/
├── photon-common.nix # 共通NixOS設定
├── chainfire.nix
├── flaredb.nix
└── ...
```
### 4.2 ルートCargo.toml
```toml
[workspace]
resolver = "2"
members = [
# 共通基盤
"photon-common/crates/*",
# 統合サービス
"photonnet/crates/*",
"photonauth/crates/*",
# 独立ストレージサービス
"chainfire/crates/*",
"chainfire/chainfire-client",
"flaredb/crates/*",
"lightningstor/crates/*",
# コンピュートサービス
"plasmavmc/crates/*",
"k8shost/crates/*",
# その他サービス
"apigateway/crates/*",
"creditservice/crates/*",
"creditservice/creditservice-client",
"nightlight/crates/*",
]
[workspace.package]
version = "0.1.0"
edition = "2021"
license = "MIT OR Apache-2.0"
rust-version = "1.75"
authors = ["PhotonCloud Contributors"]
repository = "https://github.com/photoncloud/photoncloud"
[workspace.dependencies]
# Photon共通ライブラリ
photon-error = { path = "photon-common/crates/photon-error" }
photon-config = { path = "photon-common/crates/photon-config" }
photon-grpc = { path = "photon-common/crates/photon-grpc" }
photon-metrics = { path = "photon-common/crates/photon-metrics" }
photon-storage = { path = "photon-common/crates/photon-storage" }
# 統合サービス
photonnet-types = { path = "photonnet/crates/photonnet-types" }
photonnet-core = { path = "photonnet/crates/photonnet-core" }
photonauth-types = { path = "photonauth/crates/photonauth-types" }
# ストレージクライアント
chainfire-client = { path = "chainfire/chainfire-client" }
flaredb-client = { path = "flaredb/crates/flaredb-client" }
# 外部依存(統一バージョン)
tokio = { version = "1.40", features = ["full"] }
tonic = { version = "0.12", features = ["tls", "tls-roots"] }
serde = { version = "1.0", features = ["derive"] }
thiserror = "1.0"
anyhow = "1.0"
tracing = "0.1"
metrics = "0.23"
```
## 5. 移行ロードマップ
### 5.1 フェーズ1: 短期(1-3ヶ月)- 共通基盤構築
| タスク | 優先度 | 依存関係 | 成果物 |
|-------|--------|---------|--------|
| photon-error作成 | 最高 | なし | 共通エラーライブラリ |
| photon-config作成 | 最高 | photon-error | 統一設定管理 |
| photon-metrics作成 | 高 | なし | 統一メトリクス |
| chainfire移行 | 高 | photon-* | chainfireの共通基盤化 |
| flaredb移行 | 高 | photon-* | flaredbの共通基盤化 |
### 5.2 フェーズ2: 中期(3-6ヶ月)- ネットワークサービス統合
| タスク | 優先度 | 依存関係 | 成果物 |
|-------|--------|---------|--------|
| photonnet-types設計 | 最高 | photon-* | 統合型定義 |
| fiberlb→photonnet-lb移行 | 高 | photonnet-types | LB機能移行 |
| flashdns→photonnet-dns移行 | 高 | photonnet-types | DNS機能移行 |
| prismnet→photonnet-core移行 | 高 | photonnet-types | VPC機能移行 |
| photonnet-server統合 | 中 | 上記全部 | 統合サーバー |
### 5.3 フェーズ3: 長期(6-12ヶ月)- セキュリティ統合と最適化
| タスク | 優先度 | 依存関係 | 成果物 |
|-------|--------|---------|--------|
| photonauth設計 | 高 | photon-* | セキュリティ統合設計 |
| iam→photonauth移行 | 中 | photonauth設計 | 認証認可統合 |
| mtls-agent統合 | 中 | photonauth | mTLS統合 |
| コンポーネント間連携強化 | 低 | 全部 | 最適化 |
### 5.4 移行図
```mermaid
gantt
title PhotonCloud移行ロードマップ
dateFormat YYYY-MM
section Phase1: 共通基盤
photon-error開発 :done, p1e, 2026-01, 1M
photon-config開発 :active, p1c, after p1e, 1M
photon-metrics開発 :p1m, after p1e, 1M
chainfire移行 :p1cf, after p1c, 1M
flaredb移行 :p1fd, after p1c, 1M
section Phase2: ネットワーク統合
photonnet設計 :p2d, after p1cf, 1M
fiberlb移行 :p2f, after p2d, 2M
flashdns移行 :p2d2, after p2d, 2M
prismnet移行 :p2p, after p2d, 2M
photonnet統合テスト :p2t, after p2f, 1M
section Phase3: セキュリティ統合
photonauth設計 :p3d, after p2t, 1M
iam移行 :p3i, after p3d, 2M
mtls統合 :p3m, after p3d, 2M
最終統合 :p3f, after p3m, 1M
```
## 6. リスクと緩和策
| リスク | 確率 | 影響 | 緩和策 |
|-------|------|------|--------|
| 移行中の回帰バグ | 高 | 高 | 包括的テストスイート、段階的ロールアウト |
| パフォーマンス低下 | 中 | 高 | ベンチマーク継続、プロファイリング |
| チーム学習コスト | 中 | 中 | ドキュメント整備、ペアプログラミング |
| 循環依存の発生 | 中 | 高 | 厳格なアーキテクチャレビュー |
| 古いコードの技術負債 | 高 | 中 | 移行期間中の並行メンテナンス |
## 7. 次のステップ
1. **設計レビュー**: 本設計案の承認を得る
2. **PoC実装**: photon-errorとphoton-configのプロトタイプ
3. **移行計画詳細化**: 各フェーズの詳細タスク分解
4. **チーム編成**: 各コンポーネントの移行担当者決定
5. **CI/CD更新**: 新しいワークスペース構造への対応
---
*本ドキュメントは設計検討用です。実装前に詳細レビューを実施してください。*