主题
Pingora 异步运行时与线程模型
Pingora 采用 异步运行时(Async Runtime) 和多线程模型,以支持高并发、高性能的请求处理。
异步运行时
- 基于 Tokio 异步运行时
- 支持非阻塞 IO 和高效事件循环
- 异步任务使用
async/await
语法编写
示例
rust
#[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 提供安全方式处理阻塞任务:
rust
tokio::task::spawn_blocking(|| {
// 阻塞操作,例如文件 IO 或复杂计算
});
spawn_blocking
会将任务调度到专用线程池- 异步运行时不会被阻塞
并发优化
- 合理设置工作线程数量
- 使用连接池复用资源
- 避免长时间阻塞异步任务
- 充分利用异步过滤器与上下文共享
结合 CTX 与过滤器
异步运行时与上下文(CTX)结合,可以在各阶段安全共享状态:
rust
async fn my_filter(req: &Request, ctx: &mut Context) -> Result<(), Error> {
ctx.insert("request_id", req.id());
Ok(())
}
通过理解 Pingora 的异步运行时和线程模型,可以更高效地开发高并发代理服务,避免阻塞瓶颈,提升整体性能。