domain-web について
domain-web は、Rust の Web アプリケーション設計を扱うスキルです。非同期ハンドラー、スレッドセーフな状態、リクエストのライフサイクル、検証、可観測性と、それらを実現するフレームワークやパターンを説明します。
主な機能
- 01非ブロッキングの非同期ハンドラー
- 02スレッドセーフな共有アプリケーション状態
- 03リクエスト単位のリソース管理
- 04検証付きリクエスト抽出
- 05統一されたエラーレスポンス
- 06tracing と Tower のミドルウェア
活用シーン
- 01ブロッキングを避ける HTTP ハンドラーの設計
- 02ハンドラー間でのアプリケーション状態共有
- 03受信リクエストデータの検証
- 04ミドルウェアによる横断的処理の整理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ actionbook/ rust-skills --skill domain-webインストール後、Claude Code で/domain-webを入力して読み込まれたか確認します。
詳細
Web ドメイン
レイヤー 3:ドメイン制約
ドメイン制約 → 設計への影響
| ドメインルール | 設計上の制約 | Rust での影響 |
|---|---|---|
| ステートレス HTTP | リクエスト単位のグローバル変数を使わない | エクストラクターに状態を保持 |
| 並行処理 | 多数の接続を処理する | 非同期、Send + Sync |
| レイテンシ SLA | 高速な応答 | 効率的な所有権管理 |
| セキュリティ | 入力の検証 | 型安全なエクストラクター |
| 可観測性 | リクエストのトレース | tracing + tower レイヤー |
重要な制約
デフォルトで非同期
RULE: Web handlers must not block
WHY: Block one task = block many requests
RUST: async/await, spawn_blocking for CPU work
状態管理
RULE: Shared state must be thread-safe
WHY: Handlers run on any thread
RUST: Arc<T>, Arc<RwLock<T>> for mutable
リクエストのライフサイクル
RULE: Resources live only for request duration
WHY: Memory management, no leaks
RUST: Extractors, proper ownership
下位レイヤーへ ↓
制約から設計へ(レイヤー 2):
"Need shared application state"
↓ m07-concurrency: Use Arc for thread-safe sharing
↓ m02-resource: Arc<RwLock<T>> for mutable state
"Need request validation"
↓ m05-type-driven: Validated extractors
↓ m06-error-handling: IntoResponse for errors
"Need middleware stack"
↓ m12-lifecycle: Tower layers
↓ m04-zero-cost: Trait-based composition
フレームワークの比較
| フレームワーク | スタイル | 最適な用途 |
|---|---|---|
| axum | 関数型、tower | モダンな API |
| actix-web | アクターベース | 高パフォーマンス |
| warp | フィルターの合成 | 合成可能な API |
| rocket | マクロ駆動 | 迅速な開発 |
主なクレート
| 用途 | クレート |
|---|---|
| HTTP サーバー | axum, actix-web |
| HTTP クライアント | reqwest |
| JSON | serde_json |
| 認証/JWT | jsonwebtoken |
| セッション | tower-sessions |
| データベース | sqlx, diesel |
| ミドルウェア | tower |
設計パターン
| パターン | 用途 | 実装 |
|---|---|---|
| エクストラクター | リクエストの解析 | State(db), Json(payload) |
| エラーレスポンス | エラーの統一 | impl IntoResponse |
| ミドルウェア | 横断的関心事 | Tower レイヤー |
| 共有状態 | アプリ設定 | Arc<AppState> |
コードパターン:Axum ハンドラー
async fn handler(
State(db): State<Arc<DbPool>>,
Json(payload): Json<CreateUser>,
) -> Result<Json<User>, AppError> {
let user = db.create_user(&payload).await?;
Ok(Json(user))
}
// Error handling
impl IntoResponse for AppError {
fn into_response(self) -> Response {
let (status, message) = match self {
Self::NotFound => (StatusCode::NOT_FOUND, "Not found"),
Self::Internal(_) => (StatusCode::INTERNAL_SERVER_ERROR, "Internal error"),
};
(status, Json(json!({"error": message}))).into_response()
}
}
よくある間違い
| 間違い | ドメイン違反 | 修正方法 |
|---|---|---|
| ハンドラー内でブロッキング処理を行う | レイテンシの急増 | spawn_blocking |
| 状態に Rc を使う | Send + Sync ではない | Arc を使う |
| 検証を行わない | セキュリティリスク | 型安全なエクストラクター |
| エラーレスポンスがない | UX の悪化 | IntoResponse を実装 |
レイヤー 1 へ
| 制約 | レイヤー 2 のパターン | レイヤー 1 の実装 |
|---|---|---|
| 非同期ハンドラー | Async/await | tokio ランタイム |
| スレッドセーフな状態 | 共有状態 | Arc, Arc<RwLock> |
| リクエストのライフサイクル | エクストラクター | From による所有権 |
| ミドルウェア | Tower レイヤー | トレイトベースの合成 |
関連スキル
| 場合 | 参照先 |
|---|---|
| 非同期パターン | m07-concurrency |
| 状態管理 | m02-resource |
| エラー処理 | m06-error-handling |
| ミドルウェアの設計 | m12-lifecycle |
コメント
Markdown 対応