教程 pingora tutorial

在阶段间共享状态(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); // 更新数据

使用场景

  1. 请求计时:记录开始和结束时间,计算延迟
  2. 身份验证信息:在认证阶段存储用户信息,后续阶段使用
  3. 自定义标记:根据请求特征标记不同处理策略
  4. 错误追踪:在阶段间传递错误信息,用于统一日志记录

通过 CTX,你可以在 Pingora 的不同请求阶段之间安全、灵活地共享数据,从而实现复杂的自定义逻辑与高效的请求处理。