QCon 2022·上海站 | 学习笔记3: 字节跳动在 Rust 方向的探索和实践

简介: QCon 2022·上海站 | 学习笔记3: 字节跳动在 Rust 方向的探索和实践

字节跳动在 Rust 方向的探索和实践

吴迪 / 火山引擎 基础架构服务框架工程师

CloudWeGo-Volo 负责人

2019 年加入字节跳动架构组 负责微服务框架开发

我们为什么选择了 Rust 语言

Go 语言的桎梏

  • 深度优化困难
  • 工具链和包管理不够成熟
  • 抽象能力较弱
  • 零成本抽象
  • 不用的东西,不需要为之付出代价
  • 用到的东西,也不可能做得更好
  • Thrift 编解码抽象
  • Apache Thrift 抽象出 TProtocol、TTransport(interface) 用于支持多种不同 Protocol、Transport 组合
  • 直接依赖具体的 Binary Protocol struct 实现
  • Interface 的代价
  • interface 是动态分发(运行时通过类型元数据和指针 去动态调用所需方法)
  • 无法 inline

Sonic: 性能最好的 Go JSON 库


Rust 三大优势: 性能 安全 协作


安全性

  • Rust 1.0 之后,在非 unsafe 代码中,不可能出现内存安全问题
  • 推论:一切内存 / 并发安全问题,都是 unsafe 代码导致的

协作: 工程实践出来的语言 -> 信任别人的代码

• 智能的编译器

• 完善的文档

• 齐全的工具链

• 成熟的包管理


Rust 开发者调研

业界的应用案例

Rust for Linux: Linux 内核至今为止,唯一接受的 C 以外的语言

和 C++、Go 对比

我们做了什么

公司内(之前)生态情况: 0

如何建立生态

  • 编译打包基础设施
  • 运行基础设施(和运行环境对接)
  • 内网 crates.io / docs.rs
  • 基础库
  • 开发框架

基础库

  • 必需基础库:日志、监控、链路追踪、mysql、redis、动态配置、mq • 非必需基础库:发动群众的力量

开发框架

  • Web 框架:基于 Axum
  • RPC 框架:CloudWeGo/Volo
  • 异步运行时:Monoio

发现的问题

  • 会遇到一些开源库的 bug / 不完全满足需求
  • 要能够自己去解决问题 / 提 PR / 依赖自己 Fork 版本
  • 很多一线同学很喜欢,想要使用
  • 但是 Leader 会担心,团队只有一个人会 Rust,如果人员变动无法维护

如何推动落地

  • 快速达成 MVP,开发个人、POC 项目
  • 很多工程师对 Rust 感兴趣,只是缺少一个契机 / 有人带头
  • 寻找典型业务,共同开发,获得收益:Proxy / 重计算但逻辑简单
  • 需要一些前期投入,但是是值得的

实践:nightly + GAT + TAIT

  • nightly:真香
  • GAT:generic associated types
  • TAIT:type alias impl trait

落地成果

业务 A(Proxy 类):

CPU Usage 630% -> 380%

MEM 9GB -> 2GB

P99 150-200ms -> 20-35ms A VG 4-5ms -> 1.5ms


业务 B(有大量业务逻辑): CPU 400% -> 130%


业务C:

CPU -50%,MEM -95%


业务 D(线上重要业务): 吞吐 +95.96%

成本 -48.97% avg -14.29% p99 -18.18% p999 -10.26%


算一算

  • 437 元 / CPU*年
  • 业务使用 10000 核,节省 5000 核
  • 5000*437 = 2,185,000 元 / 年
  • 开发/办公成本:20w*6月=1,200,000元
  • 第一年净收益:985000 元
  • 实际上收益远不止这个值,CPU 成本没这么便宜,开发成本也远 达不到这么高

展望未来:机遇与挑战

Rust 现状

  • 一句话:好用,但不够好用
  • 抽象能力表达能力很强,但是高阶抽象还有些问题(基本不会用到)
  • 异步生态较为完善,但是和同步存在一些割裂,易用性也还可以提升
  • Rust 2024 正在解决这些问题
  • 开发者喜爱,想要尝试,用户忠诚度极高
  • 开源项目爆炸性增长,关注度极高
  • 越来越多公司接受并使用

Rust 应用的方向

  • 基础架构组件
  • 工具
  • Linux
  • 服务端
  • WebAssembly
  • 嵌入式
  • OS

面临的挑战

  • Rust 职位不够多Rust 人才不够多
  • Rust 在中国名声不够响(与 Go 相比)
  • Rust 缺少像 k8s 一样的杀手级应用(也许 Rust for Linux 算?)

机遇

  • 降本增效
  • 对底层技术越来越关注
  • 关注度足够高,社区快速发展

拥抱开源,回馈社区

目录
相关文章
|
3月前
|
数据采集 Rust 安全
Rust在网络爬虫中的应用与实践:探索内存安全与并发处理的奥秘
【8月更文挑战第31天】网络爬虫是自动化程序,用于从互联网抓取数据。随着互联网的发展,构建高效、安全的爬虫成为热点。Rust语言凭借内存安全和高性能特点,在此领域展现出巨大潜力。本文探讨Rust如何通过所有权、借用及生命周期机制保障内存安全;利用`async/await`模型和`tokio`运行时处理并发请求;借助WebAssembly技术处理动态内容;并使用`reqwest`和`js-sys`库解析CSS和JavaScript,确保代码的安全性和可维护性。未来,Rust将在网络爬虫领域扮演更重要角色。
73 1
|
3月前
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
38 0
|
4月前
|
Rust 安全 编译器
Rust中的生命周期管理:深入理解与实践
【7月更文挑战第10天】Rust中的生命周期是确保内存安全和避免数据竞争的关键机制。通过深入理解生命周期的概念、使用场景及省略规则,我们可以编写出更加安全、高效的Rust代码。虽然生命周期管理在初学时可能显得有些复杂,但一旦掌握,它将成为我们编写Rust代码时不可或缺的工具。希望本文能够帮助你更好地理解Rust中的生命周期管理,并在实际开发中灵活运用。
|
6月前
|
Rust 安全 测试技术
Rust并发编程实践:快速入门系统级编程
Rust是一门现代的系统编程语言,它的设计目标是提供安全性、并发性和高性能。Rust的出现是为了解决其他编程语言在这些方面存在的一些问题和挑战。
|
6月前
|
Rust 监控 JavaScript
抖音技术分享:飞鸽IM桌面端基于Rust语言进行重构的技术选型和实践总结
本文将介绍飞鸽IM前端团队如何结合Rust对飞鸽客户端接待能力进行的技术提升,一步步从概念验证、路径分解到分工开发,再到最后上线收益论证,并分享了其中遇到的技术挑战与经验总结等。
154 1
|
6月前
|
Rust 监控 算法
Rust中的系统性能监控与调优:提升应用效能的关键实践
随着Rust在系统级编程中的广泛应用,性能监控与调优变得尤为关键。本文介绍了在Rust中实施系统性能监控的方法,探讨了Rust应用的性能瓶颈,并提供了调优策略与最佳实践,旨在帮助开发者更有效地提升Rust应用的性能。
|
6月前
|
缓存 Rust 算法
Rust中的数据结构与算法优化实践
在Rust编程语言中,优化数据结构与算法是提高程序性能的关键。本文首先介绍了Rust的特点,然后重点讨论了如何在Rust中优化数据结构和算法,包括使用标准库中的高效数据结构、自定义数据结构的优化技巧、算法选择与改进、以及Rust特性如所有权和借用检查器的应用。通过实际案例,我们将展示如何在Rust中实现更高效的数据结构与算法。
|
6月前
|
Rust 前端开发 JavaScript
Rust与JavaScript的跨语言交互:探索与实践
本文旨在探讨Rust与JavaScript之间的跨语言交互方法。我们将深入了解WebAssembly(Wasm)的角色,以及它如何使得Rust与JavaScript能够在Web应用中和谐共处。此外,我们还将介绍Rust与JavaScript的集成方式,包括Rust编译到Wasm、使用wasm-bindgen进行Rust与JavaScript的绑定,并通过实际案例展示如何实现两者之间的交互。
|
6月前
|
Rust 前端开发 JavaScript
Rust在前端与全栈开发中的实践探索
随着Rust语言的日渐成熟,其应用场景已经从后端扩展到前端和全栈开发领域。本文将深入探讨Rust语言在前端与全栈开发中的实际应用案例,分析Rust语言在这些领域的优势和面临的挑战,并展望Rust未来的发展趋势。
|
6月前
|
缓存 Rust 安全
Rust中的RESTful API构建:实践与探索
本文详细阐述了在Rust编程语言中如何构建RESTful API的过程。我们将通过实际示例,介绍Rust的生态系统中用于构建API的流行库和框架,包括Actix-Web、Rocket和Gotham。此外,我们还将讨论RESTful设计原则、API安全性、性能优化等方面的内容,帮助读者在Rust中高效、安全地构建RESTful API。