Cloudflare基于Rust重构核心系统,性能提升25%并增强安全性

Cloudflare使用Rust语言重构了其核心系统FL,新系统FL2采用模块化架构,基于Oxy框架构建,性能提升25%,响应时间减少10毫秒,同时通过内存安全设计和严格模块化提升了系统安全性。

Cloudflare基于Rust实现更快更安全的系统升级

Cloudflare始终致力于构建和运营全球最快的网络。我们在硬件、对等互联安排以及运行网络的软件方面持续投入。今天,我们很高兴分享一项重大软件升级,通过第三方CDN性能测试显示,这次升级将中位响应时间减少了10毫秒,性能提升了25%。

系统演进历程

每个到达Cloudflare的请求都会经历一个旅程:首先终止于我们的HTTP和TLS层,然后通过称为FL的系统,最后通过Pingora执行缓存查找或在需要时从源站获取数据。

FL是Cloudflare的核心系统,建于15年前。随着产品增加,FL变得难以维护、处理请求变慢且扩展困难。FL最初基于NGINX webserver,产品逻辑用PHP实现。2013年,系统进行了几乎完全重写,移除了PHP,改用NGINX、OpenResty框架和LuaJIT。

Rust与严格模块化

2024年7月,我们开始了一个全新实现——FL2。我们使用Rust编程语言,基于Oxy框架构建FL2,并建立了严格的模块框架来组织所有逻辑。

为什么选择Oxy?

Oxy结合了性能、安全性和灵活性。基于Rust构建,它消除了基于Nginx/LuaJIT的FL1中存在的整类错误,如内存安全问题和数据竞争,同时提供C级性能。Oxy还带有丰富的内置功能,如监控、软重载、动态配置加载和交换。

平滑重启 - 保持互联网流畅运行

Oxy带来的最有影响力的改进之一是重启处理。它包含内置的优雅重启机制,让我们能够在不断开连接的情况下推出新版本。当基于Oxy的服务的新实例启动时,旧实例停止接受新连接但继续服务现有连接。

我们进一步使用systemd套接字激活,将套接字的生命周期与Oxy应用程序本身解耦。如果Oxy进程重启或崩溃,套接字保持打开并准备接受新连接。

从模块构建FL2

为了避免FL1中的问题,我们设计了一个将所有产品逻辑分离到明确定义模块中的平台。模块系统强制执行一些严格规则:

  • 模块不能执行任何IO
  • 模块提供阶段列表
  • 阶段按严格定义的顺序评估
  • 每个阶段定义平台提供给它的输入集和它可能发出的输出集

如何替换运行中的系统

步骤1 - OpenResty中的Rust模块

我们在基于NGINX和OpenResty的旧FL中实现了一个层,允许运行新模块。团队可以在Rust中实现他们的逻辑,并用它替换旧的Lua逻辑,而无需等待旧系统的完全替换。

步骤2 - 测试和自动部署

我们构建了一个名为Flamingo的系统,允许我们同时对生产和预生产系统运行数千个完整的端到端测试请求。相同的测试在FL1和FL2上运行,确保我们不会改变行为。

步骤3 - 回退机制

如果FL2收到不知道如何处理请求或配置,它会执行回退 - 将整个内容传递给FL1。这使我们能够在FL2不完全完成的情况下向其发送流量,并比较两个系统的行为。

步骤4 - 逐步部署

我们在2025年初开始通过FL2运行客户流量,并逐步增加服务流量量。我们从免费客户开始,然后推进到付费客户。目前,我们的大多数客户正在使用FL2。

FL2的影响

FL2比FL1快得多,主要原因是FL2执行的工作更少。每个模块都能提供一组过滤器,控制它们是否运行,这意味着我们不会为每个请求运行每个产品的逻辑。

另一个重要原因是FL2是单一代码库,用性能聚焦的语言实现。相比之下,FL1基于NGINX(用C编写),结合LuaJIT(Lua和C接口层),还包含大量Rust模块。

内部测量显示,FL2使用的CPU不到FL1的一半,内存使用也远少于一半。

安全性

FL2在设计上比FL1更安全。Rust语言具有强大的编译时内存检查和类型系统,避免了大量错误类别。结合严格的模块系统,我们可以高度自信地进行大多数更改。

下一步计划

我们将在2025年剩余时间完成从FL1到FL2的迁移,并在2026年初关闭FL1。我们已经在客户性能和开发速度方面看到了好处,并期待将这些带给所有客户。

我们还有一个服务需要完全迁移。图中的"HTTP & TLS Termination"框也是一个NGINX服务,我们正在用Rust重写它,预计明年初完成。

之后,当所有内容都模块化、用Rust编写并经过测试和扩展后,我们可以真正开始优化!我们将重新组织和简化模块之间的连接方式,扩展对非HTTP流量(如RPC和流)的支持等等。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计