Pingora 异步运行时与线程模型

Pingora 采用 异步运行时(Async Runtime) 和多线程模型,以支持高并发、高性能的请求处理。

异步运行时

  • 基于 Tokio 异步运行时
  • 支持非阻塞 IO 和高效事件循环
  • 异步任务使用 async/await 语法编写

示例

#[tokio::main]
async fn main() {
    let server = Server::new(None).unwrap();
    server.bootstrap();

    let app = http_proxy_service(None);
    server.run_forever(app).unwrap();
}

`

线程模型

  • 工作线程(Worker Threads)

    • 执行异步任务
    • 默认数量可通过配置调整
  • 异步任务调度

    • 任务在线程池中调度
    • 阻塞操作需特殊处理,否则会影响整个线程池

阻塞操作处理

在异步上下文中直接执行阻塞操作会导致性能下降。 Pingora 提供安全方式处理阻塞任务:

tokio::task::spawn_blocking(|| {
    // 阻塞操作,例如文件 IO 或复杂计算
});
  • spawn_blocking 会将任务调度到专用线程池
  • 异步运行时不会被阻塞

并发优化

  1. 合理设置工作线程数量
  2. 使用连接池复用资源
  3. 避免长时间阻塞异步任务
  4. 充分利用异步过滤器与上下文共享

结合 CTX 与过滤器

异步运行时与上下文(CTX)结合,可以在各阶段安全共享状态:

async fn my_filter(req: &Request, ctx: &mut Context) -> Result<(), Error> {
    ctx.insert("request_id", req.id());
    Ok(())
}

通过理解 Pingora 的异步运行时和线程模型,可以更高效地开发高并发代理服务,避免阻塞瓶颈,提升整体性能。