Rocket 的共享状态叫 managed state。
你可以把它理解成:
控制塔中央总控台上的共享面板。
它适合放:
- 配置
- 数据库连接池
- 缓存客户端
- 业务 service
- 计数器
- 第三方 API client
一个典型例子:
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 味道:
如果控制塔必需的总控面板根本没装,系统最好在发射前就报警,而不是等火箭点火时才发现。