乐趣区

关于rust:国内首个基于-Rust-语言的-RPC-框架-Volo-正式开源

Volo 是字节跳动服务框架团队研发的 轻量级 高性能 可扩展性强 易用性好 的 Rust RPC 框架,应用了 Rust 最新的 GAT 和 TAIT 个性。

在字节外部,Volo 曾经落地多个业务和根底组件,并且获得了超预期的性能收益(与 Go 版本比照,不那么偏心)。

Volo 与其它 CloudWeGo 开源我的项目一样,保持内外保护一套代码,为开源应用提供了强有力的保障。同时,咱们察看到 Rust 开源社区在 RPC 框架这块还比拟单薄,Volo 的开源心愿能为社区的欠缺奉献一份力量,同时也能欠缺 CloudWeGo 生态矩阵,为谋求性能、安全性和最新技术的开发者、企业以及 Rustaceans 开发 RPC 微服务、搭建云原生分布式系统提供强有力的反对。

本文会为大家简略介绍 Volo 及其相干生态,并为大家提供一个简略的 Rust 与 Go 的选型倡议。

01 我的项目缘起

其实 Volo 的开创成员来自于 Kitex 团队(CloudWeGo 开源的 Go RPC 框架),过后咱们在 Go 上做了十分深度的性能优化,也因而粗浅感触到了在 Go 上做性能优化所面临的妨碍。因而,咱们抉择了 Rust,冀望可能给需要极致性能、平安和指令级掌控能力的业务一个适合的抉择。而 RPC 框架是分布式系统中重要的组成部分,Volo 就这么诞生了。

02 个性

高性能

Rust 以高性能和平安著称,咱们在设计和实现过程中也时刻以高性能作为咱们的指标,尽可能升高每一处的开销,晋升每一处实现的性能。

首先要阐明,和 Go 的框架比照性能是极不偏心的,因而咱们不会着重比拟 Volo 和 Kitex 的性能,并且咱们给出的数据仅能作为参考,心愿大家可能主观对待。同时,因为在开源社区并没有找到另一款成熟的 Rust 语言的 Async 版本 Thrift RPC 框架,而且性能比照总是容易引战,因而咱们心愿尽可能弱化性能数据的比照,仅会颁布咱们本人极限 QPS 的数据。

在和 Kitex 雷同的测试条件(限度 4C)下,Volo 极限 QPS 为 35W。同时,咱们外部正在验证基于 Monoio(CloudWeGo 开源的 Rust Async Runtime)的版本,极限 QPS 能够达到 44W。

从咱们线上业务的火焰图来看,得益于 Rust 的动态散发和优良的编译优化,框架局部的开销根本能够忽略不计(不蕴含 syscall 开销)。

基于 GAT

设计咱们酷爱并追寻最新的技术,Volo 的外围形象应用了 Rust 最新的 GAT 个性,在这个过程中咱们也借鉴了 Tower 的设计。Tower 是一个十分优良的形象层设计,实用于非 GAT 的状况下。在此咱们非常感谢 Tower 团队。

Tower:https://github.com/tower-rs/t…

通过 GAT,咱们能够防止很多不必要的 Box 内存调配,以及晋升易用性,给用户提供更敌对的编程接口和更符合人体工程学的编程范式。咱们的外围形象如下:

因为应用了 Rust 的 GAT 个性,因而咱们能够解决返回异步 Future 带来的生命周期问题。同时,如果配合 type_alias_impl_trait 应用,成果更佳,比方实现 Timeout 能够应用如下形式:

易用性好

Rust 以难学难用而闻名,咱们心愿尽可能升高用户应用 Volo 框架以及应用 Rust 语言编写微服务的难度,提供最符合人体工程学和直觉的编码体验。因而,咱们把易用性作为咱们重要的指标之一。

比方,咱们提供了 Volo 命令行工具,用于初始化我的项目以及治理 IDL。同时,咱们将 Thrift 及 gRPC 拆分为两个独立(但共用一些组件)的框架,以提供最合乎不同协定语义的编程范式及接口。

咱们还提供了 #[service] 宏(能够了解为不须要 Box 的 async_trait)来使得用户能够无心理累赘地应用异步来编写 Service 中间件。

通过这个宏,咱们编写 Service 中间件能够简化到如下图:

扩展性强

受害于 Rust 弱小的表白和形象能力,通过灵便的中间件 Service 形象,开发者能够以十分对立的模式,对 RPC 元信息、申请和响应做解决。

比方,服务发现、负载平衡等服务治理性能,都能够以 Service 模式进行实现,而不须要独立实现 Trait。

相干的扩大,咱们会放在 github.com/volo-rs 组织下,也欢送大家奉献本人的扩大到 volo-rs

03 生态系统

Volo 是 RPC 框架的名字,随着 Volo 一起开源的有以下几个我的项目:

  1. Volo-rs:Volo 的相干生态。
  2. Pilota:Volo 应用的 Thrift 与 Protobuf 编译器及编解码的纯 Rust 实现(不依赖 protoc)
  3. Motore:Volo 参考 Tower 设计的、应用了 GAT 和 TAIT 的 middleware 形象层。
  4. Metainfo:Volo 用于进行元信息透传的组件,冀望定义一套元信息透传的规范。

04 选型倡议

“什么状况下应该用 Rust、什么状况下应该用 Go?”这是一个十分经典的问题。在 Volo 团队看来,Rust 和 Go 并不是对抗关系,而是单干关系,舍短取长。

对于性能不敏感的利用、重 IO 的利用以及须要疾速开发疾速迭代胜过稳定性的利用,举荐应用 Go,这种利用应用 Rust 并不会带来显著的收益。

对于 须要极致性能 重计算 的利用,以及 须要稳定性并能承受肯定开发速度损失 的利用,举荐应用 Rust,Rust 在极致性能优化和安全性上的劣势能够在这类利用中得以施展。

当然,还有一个很重要的思考因素,是团队现有的技术栈,即技术储备和人才储备。

05 总结

心愿本文能让大家对于 Volo 及相干生态有一个根本的理解。同时,Volo 还处于晚期阶段,欢送各位感兴趣的同学一起退出,独特建设 CloudWeGo 及 Rust 开源社区,向 Volo 提交 Issue 和 PR 共建 Volo。咱们诚心期待更多的开发者退出,也期待 Volo 助力越来越多的企业疾速构建云原生架构。如果企业客户想外部试用,咱们能够排期提供专项技术支持和交换。

参考资料

Volo 概览:https://github.com/cloudwego/…

Volo Tutorial:https://www.cloudwego.io/zh/d…

Volo 文档:https://docs.rs/volo

Volo-rs 组织:https://github.com/volo-rs

我的项目地址

GitHub:https://github.com/cloudwego

官网:www.cloudwego.io

退出移动版