Rust 构建开源 Pingora 框架可以与nginx媲美

一、概述

Cloudflare 为何弃用 Nginx,选择使用 Rust 重新构建新的代理 Pingora 框架。Cloudflare 成立于2010年,是一家领先的云服务提供商,专注于内容分发网络(CDN)和分布式域名解析。它提供一系列安全和性能优化服务,包括防火墙、DDoS防护、SSL/TLS加密和威胁分析。

二、Pingora 介绍

Pingora 是一个基于 Rust 语言的框架,用于构建快速、可靠且可编程的网络系统。日处理请求量超 1万亿次,不仅在性能显著提升,且仅需原代理基础设施三分之一的 CPU 和内存资源。

三、Nginx 在当今需求下遇到的瓶颈

随着 Cloudflare 规模的扩大,已经超越了 Nginx 的处理能力了,无法满足当下所需要的性能,Nginx 也没有在非常复杂的环境中有所需要的功能。

虽然这些年来,Cloudflare 有对 Nginx 的使用遇到了部分限制,进行了优化,但是仍然有一些限制则更难克服,如下:

首先,在 Nginx 中,每个请求只能由单个 worker 处理,这样很容易导致所有 CPU 内核之间的负载不平衡,从而导致速度变慢。由于这种请求进程锁定效应,执行 CPU 繁重或阻止 IO 任务的请求可能会减慢其他请求的速度。

对于这些问题,花了很多时间来解决,但是对于 Cloudflare 规模的用例来说,最关键的问题是糟糕的连接重用。机器与原始服务器建立 TCP 连接,以代理 HTTP 请求,连接重用通过重用之前从连接池建立的连接,跳过新连接所需的 TCP 和 TLS 握手,来加快请求的 TTFB。

但是,Nginx 连接池与单个 worker 相对应,当请求到达某个 worker 时,它只能重用该 worker 内的连接。当添加更多 Nginx worker 以进行扩展时,连接重用率会变得更差,因为连接分散在所有进程的更多孤立的池中。这导致更慢的 TTFB 以及需要维护更多连接,进而消耗更多的资源。
在这里插入图片描述

除上述,Nginx 还面临有些类型的功能难以添加问题

Nginx 是一个非常好的 Web 服务器、负载均衡器或简单的网关。但对于 Cloudflare 的作用远不止于此。团队过去常常围绕 Nginx 构建自己需要的所有功能,但要尽量避免与 Nginx 上游代码库有太多分歧,不是一件很容易事情。

例如,当重试请求/请求失败时,将请求重定向到具有不同请求头的目标服务器,但 Nginx 并不支持这种操作,这要求人力投入额外的努力来克服其限制,这种情况下,还需要额外花费时间和精力来解决 Nginx 的限制。

其次,Nginx 是用C语言编写的,在设计上并非内存安全,增加了出错的风险,而且使用第三方代码库非常容易出错。 即使对于经验丰富的工程师来说,也很容易陷入内存安全问题,未来希望尽可能避免这些问题。

为了补充C语言,选择使用了 Lua,它相对安全但性能较低。 在处理复杂的 Lua 代码时,经常怀念静态类型的便利,而且 Nginx 社区的活跃度不高 ,开发过程往往较为封闭。

四、Pingora 项目设计决定

为了打造一个每秒提供数百万次请求且快速、高效和安全的代理,必须首先做出一些重要的设计决
定。设计核心如下:

选择 Rust 语言: 因为它可以在不影响性能的情况下以内存安全的方式完成 C 语言可以做的事情。

自建 HTTP 库: 选择自建的 HTTP 库而非现成的第三方库,以提高处理HTTP流量的灵活性和自主创新的能力。

支持多样化、不符合 RFC 的HTTP流量: 由于Cloudflare需要支持各种不符合RFC标准的HTTP流量,Pingora设计为一个稳健、宽容、可定制的HTTP库,以适应互联网各种风险环境和不规范的用例。

处理非标准的HTTP状态码: 为了应对服务器支持使用599到999之间的状态代码,Pingora实现了一个稳健的HTTP状态码处理系统,以适应不同HTTP生态系统中的多样性。

多线程工作负载调度: Pingora选择了多线程而不是多进程,以便轻松共享资源,特别是连接池。采用Tokio异步运行时来避免性能问题,并实施了工作窃取以提高效率。

基于请求生命周期的可编程接口: 实施了类似于NGINX/OpenResty的基于“请求生命周期”事件的可编程接口。这使得开发人员能够通过编写代码在请求的不同阶段进行干预,例如在请求标头接收时修改或拒绝请求,从而清晰地分离业务逻辑和通用代理逻辑。

五、很完美,Pingora 在生产中更快

Pingora 处理几乎所有需要与源服务器交互的 HTTP 请求(例如缓存未命中),在此过程中收集了很多性能数据。

首先,看到 Pingora 如何加快客户的流量,Pingora 上的总体流量显示,TTFB 中位数减少了 5 毫秒,第 95 个百分位数减少了 80 毫秒。这不是因为运行代码更快。甚至之前的旧服务也可以处理亚毫秒范围内的请求。

时间节省来自新架构,它可以跨所有线程共享连接,这意味着更好的连接重用率,在 TCP 和 TLS 握手上花费的时间更少。
在这里插入图片描述
在所有客户中,与旧服务相比,Pingora 每秒的新连接数只有三分之一。对于一个主要客户,它将连接重用率从 87.1% 提高到 99.92%,这将新连接减少了 160 倍。更直观地说,通过切换到 Pingora,每天为客户和用户节省了 434 年的握手时间。

六、Pingora 功能亮点

  • 异步 Rust 快速且可靠
  • HTTP 1/2 端到端代理
  • 基于 OpenSSL 或 BoringSSL 的 TLS
  • gRPC 和 websocket 代理
  • 优雅的重载
  • 可定制的负载平衡和故障转移策略
  • 支持多种观测工具

七、Pingora 生产环境后的反馈

更高效

在生产环境中,与我们的旧服务相比,Pingora 在相同流量负载的情况下,消耗的 CPU 和内存减少了约 70% 和 67%。以及多线程模型还使得跨请求共享数据更加高效。

更安全

像我们这样的规模下,快速安全的发布功能十分困难。很难预测在每秒处理数百万个请求的分布式环境中可能发生的每个边缘情况。Rust 的内存安全特性为我们提供了强大的保护,让我们能够信赖服务的稳定运行。更能够专注于服务间的交互,加速功能开发,无需担忧内存安全问题。

即便出现崩溃,Pingora 的稳定性也显著降低诊断难度。自推出以来,尽管处理了海量请求,但服务代码尚未导致任何崩溃,显示出其卓越的可靠性。

所以,Pingora 的崩溃极为罕见,问题往往与内核或硬件故障无关。即便在极端调试困难的情况下,软件也未导致过崩溃。

从中,我们可以看到 Rust 逐渐进入生产环境中,而且取得了很不错的效果,也相信未来 AI 领域,Rust 一定会带来很多资源节省、性能的提升及安全等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊云科技 Lambda 运行selenium

有些定时任务需要使用自动化测试的工具,如果使用亚马逊云科技 Lambda来实现这个功能的话,那么就需要图形框架,而我们知道lambda其实是一个虚拟机,而且按照系统级别依赖比较困难。所以这里选择使用容器的形式进行发布。 在dockerf…

【原创】[新增]ARCGIS之土地报备Txt、征地Xls格式批量导出Por旗舰版

一、软件简介 2024年新增旗舰版软件,本软件全新界面开发,保留原有软件功能及一些使用习惯,并集成了现已有的所有定制格式的支持,并增加自定义格式的导出;做到1N2(即为1种通用版本N种定制格式导出txt、Xls&a…

机器学习模型—分类回归树(CART)

机器学习模型—分类回归树(CART) **CART(分类和回归树)**是决策树算法的一种变体。它可以处理分类和回归任务。Scikit-Learn使用分类和回归树 (CART) 算法来训练 决策树。CART 最初由 Leo Breiman、Jerome Friedman、Richard Olshen 和 Charles Stone 于 1984 年制作。 CAR…

c++的STL(4)-- list容器

list容器概述 list的容器的实现是使用双向链表的形式的数据结构实现的。(也有的编译器使用双向循环链表) 链表是一种数据结构,这种结构与数组的结构不同,链表的每个节点都存放有特定个数的指针(双向链表:两个(一个指向前面的元素,另一个指向…

百度现在应该怎么去做搜索SEO优化?(川圣SEO)蜘蛛池

baidu搜索:如何联系八爪鱼SEO? baidu搜索:如何联系八爪鱼SEO? baidu搜索:如何联系八爪鱼SEO? 百度搜索引擎优化(SEO)是一种通过优化网站,提升网页在百度搜索结果中的排…

使用Golong轻松实现JWT身份验证

使用Golong轻松实现JWT身份验证 JSON Web Tokens (JWT)是一种流行的安全方法,用于在两个方之间表示声明。在Web应用程序领域,它们通常用作从客户端向服务器传输身份信息(声明)的方式。本教程将引导您逐步实现Go应用程序中的JWT身份…

ffmpeg 从avio_read 到 file_read

############################################# author: hjjdebug date: 2024年 03月 13日 星期三 15:39:30 CST description: ffmpeg 从avio_read 到 file_read ############################################# int nRet avio_open(&pReadCtx, "200M.ts"),…

开源生态与软件供应链研讨会

✦ 日程安排 开源生态与软件供应链研讨会 时间: 2024年3月12日(星期二)13:30 – 17:00 地点: 复旦大学江湾校区二号交叉学科楼E1021 联系人: 陈碧欢(bhchenfudan.edu.cn) 点击文末“阅读原文”或扫描下方二维码进入报名通…

ROS 语音交互(二)nlp

目录 背景: 一、模型选择 二、操作流程 三、核心代码展示 背景: 成功设置自己的知识库,语音交互问答会优先选择自己的知识库的答案进行回答,减少了耗时 一、模型选择 商汤 商量日日新 二、操作流程 文档中心 | 日日新开放…

Node.js的事件驱动模型(非阻塞I/O)

Node.js的事件驱动模型是它能高效处理并发的关键。这个模型允许Node.js在单个线程上运行,同时通过非阻塞I/O操作来处理成千上万的并发连接。下面是对Node.js事件驱动模型的详细解释: 事件循环(Event Loop) 事件循环是Node.js事件…

ChatGLM3 源码解析(五)

PrefixEncoder # 根据前缀 ID 获取前缀嵌入 # 前缀嵌入将连接到分头之后的 K 和 V 上 class PrefixEncoder(torch.nn.Module):"""The torch.nn model to encode the prefixInput shape: (batch-size, prefix-length)Output shape: (batch-size, prefix-length,…

2024 前端javaScript+ES6

JavaScript 基础 1、基本数据类型: 1.1 基本数据类型: Number(数值):表示数字,包括整数和浮点数。例如:5、3.14。 String(字符串):表示文本数据&#xff…

视觉图像处理和FPGA实现第三次作业--实现一个加法器模块

一、adder模块 module adder(ina, inb, outa); input [5:0] ina ; input [5:0] inb ; output [6:0] outa ;assign outa ina inb; endmodule二、add模块 module add(a,b,c,d,e); input [5:0] a ; input [5:0] b ; input [5:…

阿里云国际修改域名绑定的DDoS高防服务器

本文九河云介绍当您的业务需要绑定多个DDoS高防实例,或者已有的DDoS高防实例已过期需要更换时,如何修改域名接入的配置,才能在业务不中断的前提下平滑迁移。 需绑定多个DDoS高防实例的场景 当网站业务有如下业务需求时,可以为域…

PTA L2-020 功夫传人

一门武功能否传承久远并被发扬光大,是要看缘分的。一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱…… 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹、挖到了特别的…

netty服务器监听和接收数据

1.pom依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><!-- 根据需要选择版本 --><version>4.1.86.Final</version> </dependency>2.配置属性 application.properties #启动端口 ser…

从零开始,一步步构建服务网格istio

一、环境情况 环境&#xff1a;Ubuntu20.04 机器数量&#xff1a;单机1台 IP&#xff1a;10.9.2.83 二、准备知识 为什么使用 Istio&#xff1f; Istio提供了一种更高级别的服务网格解决方案&#xff0c;它可以简化和加强 Kubernetes 集群中的服务间通信、流量管理、安全…

Git操作指南:子模块、用户名修改和Subtree

引言 在软件开发中&#xff0c;版本控制是一个至关重要的环节。Git 作为目前最流行的版本控制工具之一&#xff0c;提供了丰富的功能和灵活的操作方式。本文将介绍一些常用的 Git 操作&#xff0c;包括管理子模块、修改用户名、使用 Git Subtree 合并项目以及其他一些常见操作…

基于R语言APSIM模型应用

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

鸿蒙开发之MPChart图表开发

一、简介 随着移动应用的不断发展,数据可视化成为提高用户体验和数据交流的重要手段之一,因此需要经常使用图表,如折线图、柱形图等。OpenHarmony提供了一个强大而灵活的图表库是实现这一目标的关键。 在 ohpm 中心仓(https://ohpm.openharmony.cn/)中,汇聚了众多开发者…