共计 2596 个字符,预计需要花费 7 分钟才能阅读完成。
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 一起开源的有以下几个我的项目:
- Volo-rs:Volo 的相干生态。
- Pilota:Volo 应用的 Thrift 与 Protobuf 编译器及编解码的纯 Rust 实现(不依赖 protoc)
- Motore:Volo 参考 Tower 设计的、应用了 GAT 和 TAIT 的 middleware 形象层。
- 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