mcpField
D
domain-cloud-native

domain-cloud-native

github.com/actionbookクラウド・DevOps1.6k2.9k 回インストール9 週間前に更新
リポジトリ

domain-cloud-native について

Rust によるクラウドネイティブ開発向けのドメイン資料です。ステートレス設計、可観測性、グレースフルシャットダウンなどの制約を設計パターンや実装方法に結び付けています。サービスや Kubernetes ワークロードの開発者向けです。

主な機能

  1. 01クラウドネイティブの制約を解説
  2. 02制約と Rust の実装を対応付け
  3. 03よく使う Crate を掲載
  4. 04ヘルスチェックと終了処理のパターン

活用シーン

  1. 01ステートレスなサービス構成の計画
  2. 02サービスへのトレースとヘルスチェックの追加
  3. 03SIGTERM 時のグレースフルシャットダウン設計

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/actionbook/rust-skills --skill domain-cloud-native

インストール後、Claude Code で/domain-cloud-nativeを入力して読み込まれたか確認します。

詳細

クラウドネイティブドメイン

レイヤー 3:ドメイン制約

ドメイン制約 → 設計への影響

ドメインルール設計上の制約Rust への影響
12-Factor環境変数から設定環境ベースの設定
可観測性メトリクス + トレースtracing + opentelemetry
ヘルスチェックライブネス/レディネス専用エンドポイント
グレースフルシャットダウンクリーンな終了シグナル処理
水平スケーリングステートレス設計ローカル状態なし
コンテナ対応小さなバイナリリリース最適化

重要な制約

ステートレス設計
RULE: No local persistent state
WHY: Pods can be killed/rescheduled anytime
RUST: External state (Redis, DB), no static mut
グレースフルシャットダウン
RULE: Handle SIGTERM, drain connections
WHY: Zero-downtime deployments
RUST: tokio::signal + graceful shutdown
可観測性
RULE: Every request must be traceable
WHY: Debugging distributed systems
RUST: tracing spans, opentelemetry export

さかのぼる ↓

制約から設計へ(レイヤー 2):

"Need distributed tracing"
    ↓ m12-lifecycle: Span lifecycle
    ↓ tracing + opentelemetry

"Need graceful shutdown"
    ↓ m07-concurrency: Signal handling
    ↓ m12-lifecycle: Connection draining

"Need health checks"
    ↓ domain-web: HTTP endpoints
    ↓ m06-error-handling: Health status

主要なクレート

用途クレート
gRPCtonic
Kuberneteskube, kube-runtime
Dockerbollard
トレーシングtracing, opentelemetry
メトリクスprometheus, metrics
設定config, figment
ヘルスHTTP エンドポイント

設計パターン

パターン用途実装
gRPC サービスサービスメッシュtonic + tower
K8s オペレーターカスタムリソースkube-runtime Controller
可観測性デバッグtracing + OTEL
ヘルスチェックオーケストレーション/health, /ready
設定12-factor環境変数 + シークレット

コードパターン:グレースフルシャットダウン

use tokio::signal;

async fn run_server() -> anyhow::Result<()> {
    let app = Router::new()
        .route("/health", get(health))
        .route("/ready", get(ready));

    let addr = SocketAddr::from(([0, 0, 0, 0], 8080));

    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .with_graceful_shutdown(shutdown_signal())
        .await?;

    Ok(())
}

async fn shutdown_signal() {
    signal::ctrl_c().await.expect("failed to listen for ctrl+c");
    tracing::info!("shutdown signal received");
}

ヘルスチェックパターン

async fn health() -> StatusCode {
    StatusCode::OK
}

async fn ready(State(db): State<Arc<DbPool>>) -> StatusCode {
    match db.ping().await {
        Ok(_) => StatusCode::OK,
        Err(_) => StatusCode::SERVICE_UNAVAILABLE,
    }
}

よくある間違い

間違いドメイン違反修正方法
ローカルファイルの状態ステートレスではない外部ストレージ
SIGTERM の処理がない強制終了グレースフルシャットダウン
トレーシングがないデバッグできないtracing スパン
静的な設定12-factor ではない環境変数

レイヤー 1 までさかのぼる

制約レイヤー 2 のパターンレイヤー 1 の実装
ステートレス外部状態外部向けの Arc
グレースフルシャットダウンシグナル処理tokio::signal
トレーシングスパンのライフサイクルtracing + OTEL
ヘルスチェックHTTP エンドポイント専用ルート

関連スキル

該当する場合参照先
非同期パターンm07-concurrency
HTTP エンドポイントdomain-web
エラー処理m13-domain-error
リソースのライフサイクルm12-lifecycle

コメント