主题
在阶段间共享状态(CTX)
Pingora 的请求处理采用多阶段机制,每个阶段可以通过 上下文对象(Context,简称 CTX) 共享数据。
这使得你可以在不同阶段读取或修改请求相关状态,实现灵活的逻辑处理。
CTX 的作用
- 在请求生命周期各阶段传递数据
- 避免全局变量,提高代码安全性
- 支持存储任意类型的数据(通过 Rust 类型系统)
在 CTX 中存储数据
rust
use pingora::prelude::*;
fn pre_filter(req: &Request, ctx: &mut Context) -> Result<(), Error> {
// 记录请求开始时间
ctx.insert("start_time", std::time::Instant::now());
Ok(())
}
insert(key, value)
:存储数据- key 通常为字符串,value 可为任意可发送类型
在后续阶段读取数据
rust
fn response_filter(_req: &Request, ctx: &mut Context) -> Result<(), Error> {
if let Some(start) = ctx.get::<std::time::Instant>("start_time") {
let duration = start.elapsed();
println!("请求处理耗时: {:?}", duration);
}
Ok(())
}
get::<T>(key)
:获取指定类型的数据- 如果 key 不存在,返回
None
删除或更新 CTX 数据
rust
ctx.remove("start_time"); // 删除数据
ctx.insert("start_time", new_value); // 更新数据
使用场景
- 请求计时:记录开始和结束时间,计算延迟
- 身份验证信息:在认证阶段存储用户信息,后续阶段使用
- 自定义标记:根据请求特征标记不同处理策略
- 错误追踪:在阶段间传递错误信息,用于统一日志记录
通过 CTX,你可以在 Pingora 的不同请求阶段之间安全、灵活地共享数据,从而实现复杂的自定义逻辑与高效的请求处理。