Pingora
是Cloudflare
弃用Nginx
,选择使用Rust
重新构建新的代理Pingora
框架,已经在Cloudflare
的云服务上运行多年,支持每秒处理每秒处理超过4000
万个互联网请求。
Github地址:https://github.com/cloudflare/pingora
根据Cloudflare
官方博客,我整理了几个点(详细博客:https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet):
对于一个普通的Server
框架来说,Nginx
的性能已经非常好了,比如 golang
和 Nginx
对比:
Nginx: Requests per second: 23770.74 [#/sec] (mean)
Golang: Requests per second: 21807.00 [#/sec] (mean)
Swoole: Requests per second: 19711.22 [#/sec] (mean)
Node.js: Requests per second: 6680.53 [#/sec] (mean)
可见在众多Server
框架中,Nginx
本身的性能是比较高的,但是对于代理服务来说,这个性能可能有时满足不了需求,因此需要一个更好的Server
框架来支持。
(1)Nginx
是多进程架构,每个请求只能通过单个worker
处理,这样可能会导致CPU之间的负载不均的问题,从而在整理性能上变慢;
(2)连接池问题:由于Nginx
的连接池是单worker
对应的,当请求在到达单个worker
时,只能重用该worker
内的连接,这样导致会维护更多的代理连接;
nginx架构
(3)功能难以添加,比如如果要在Nginx
上增加功能,要么通过C扩展功能,要么通过脚本语言(lua或者新增支持的javascript);
(1)性能更高,根据Pingora
在Cloudflare
上应用的总体流量显示,TTFB
中位数减少了5
毫秒,第95
个百分位数减少了80
毫秒,由于跨所有线程共享连接,这意味着更好的连接重用率,在TCP
和TLS
握手上花费的时间更少;
Pingora架构
(2)Pingora
根据社区可以提供更多的功能,方便扩展;
(3)由于使用Rust
开发,可以在不影响性能的情况下以内存安全的方式完成 C 语言可以做的事情,同时在开发过程中调试更方便,内存更加安全;
pub struct LB();
#[async_trait]
impl ProxyHttp for LB {
async fn upstream_peer(...) -> Result<Box<HttpPeer>> {
todo!()
}
}
fn main() {
let mut upstreams = LoadBalancer::try_from_iter(["1.1.1.1:443", "1.0.0.1:443"]).unwrap();
let mut lb = pingora_proxy::http_proxy_service(&my_server.configuration, LB(upstreams));
lb.add_tcp("127.0.0.1:6188");
let mut my_server = Server::new(None).unwrap();
my_server.add_service(lb);
my_server.run_forever();
}
(1)Rust
最低要求:Rust 1.72
(2)尽量在Linux下编译,由于官方文档提示优先支持Linux
下的功能
(3)架构支持:x86_64
和aarch64
(4)注意事项: