全书目录

第四十四篇:Rocket 完全指南 —— 火箭发射控制塔宇宙

第九章:State —— 总控台共享面板,不是每个值班员手写便签

1 分钟 422 字 第 818 / 962 个阅读单元

Rocket 的共享状态叫 managed state

你可以把它理解成:

控制塔中央总控台上的共享面板。

它适合放:

  • 配置
  • 数据库连接池
  • 缓存客户端
  • 业务 service
  • 计数器
  • 第三方 API client

一个典型例子:

rust
use std::sync::atomic::{AtomicU64, Ordering};
use rocket::State;

struct AppState {
    app_name: String,
    request_count: AtomicU64,
}

#[get("/health")]
fn health(state: &State<AppState>) -> String {
    let count = state.request_count.load(Ordering::Relaxed);
    format!("{} alive, requests={count}", state.app_name)
}

#[launch]
fn rocket() -> _ {
    rocket::build()
        .manage(AppState {
            app_name: "launch-tower".into(),
            request_count: AtomicU64::new(0),
        })
        .mount("/", routes![health])
}

这里的 &State<AppState> 本质上就是:

控制员从总控台读取统一状态。

Rocket 官方也强调,managed state 的类型需要满足 Send + Sync。 这很合理,因为总控台上的共享面板必须能安全地被并发访问。

#一个非常关键的点

State<T> 本身也是 request guard。

这意味着:

  • 它也走 Rocket 的 guard 体系
  • 它可以被别的 guard 使用
  • 缺失必要 state 时,Rocket 能更早发现问题

结合 sentinels 的设计,这套机制非常有 Rocket 味道:

如果控制塔必需的总控面板根本没装,系统最好在发射前就报警,而不是等火箭点火时才发现。