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

这篇具有很好参考价值的文章主要介绍了字节跳动在 Rust 微服务方向的探索和实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

近日, Qcon 全球软件开发大会 2022(上海站)圆满落幕,大会是由 InfoQ 中国主办的综合性技术盛会,近百位国内外技术大咖现场分享前沿技术案例与创新实践。本文整理自字节跳动火山引擎基础架构服务框架工程师吴迪于大会上的分享内容,主题为《字节跳动在 Rust 微服务方向的探索和实践》。

本次分享内容主要分为以下三个部分:

  1. 我们为什么选择了 Rust 语言;
  2. 我们做了什么;
  3. 展望未来:机遇与挑战。

嘉宾介绍

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

我会为大家主要介绍一下我们为什么会选择 Rust 语言,因为大家可能听说字节跳动比较有名的框架叫做 Kitex,是一个 Go 的框架,字节跳动在 Go 方向投入了很多,为何现在开始探索 Rust 方向呢?其次,在这个方向我们做了哪些事情,遇到的一些问题,以及我们的解决方案。其三,会为大家分享一下我们所认为目前 Rust 的机遇以及未来挑战。

我们为什么选择了 Rust 语言

一开始,我是做 Go 的语言开发,做 Go 的 RPC 框架,但当时我们遇到了很多 Go 语言的一些问题。

Go 语言的桎梏

  • 深度优化困难

在 Go 里面,你想要深度优化是非常非常困难的一件事情,因为当我们体量变得越来越大的时候,深度优化是越来越重要了。但是如果在 Go 里面,想要去做一些深度优化,你经常会发现在跟 runtime 以及编译器做很多斗争,需要用一些很 hack 的办法去绕过它的一些限制。

  • 工具链和包管理不够成熟

Go 里面的工具链和包管理相对来说不太成熟,如果有用过我们开源的 Kitex 框架的同学可能会非常了解。举个例子,比如在 Go 里面,想调一个 gRPC 的服务,或调一个 Thrift 的服务,需要调一个需要生成代码的服务,我需要先在开发的时候把代码生成好,要用一个命令行工具生成完之后,把生成代码一并地给提交到版本管理里面。直白来说,这是个很蠢的做法,像 C++、Java,还有 Python 也许都会采用一些其他的方案,但是 Go 就必须这么操作,因为它编译器就没有这个能力,没有办法在编译时去生成这个东西。还有一点,比如我在编译时也许可以调个脚本去生成,但问题在于本地没有这个文件,代码生成、代码补全提示都没有, IDE 会直接给你里面所有的就下划线飘红,这是个体验很差的事情。

  • 抽象能力较弱

Go 里面的抽象能力是比较弱的,它没有零成本抽象这么个概念。

深度优化困难

我分享一个之前遇到的真实、有意思的案例。我们做序列化、反序列化的过程当中,可能会遇到一些出错的情况。在我们之前的版本里面,代码是很简单的,在序列化、反序列化出错的时候,就直接把 error 返回来。后来我们为了优化用户的体验,想多返回一些错误信息,比如我们告诉他是在哪个 struct 里面,在 read 哪一个字段的时候出的错。这是一个很好的初衷,但是当我们新的代码上线了之后,有一个业务方就跑来说:“你这个新的代码是不是有问题?为什么我们的性能下降了 20%?” 我们认为不可能,我们所有序列化、反序列化逻辑都没有改,只改了这一行。当时我们也很纳闷,认为是不是业务方自己测试环境有问题,后来我们查了半天,最后终于发现了情况。

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

新版本代码

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

旧版本代码

大家可以看到这个是新的代码生成出来的汇编,在 Go 里面它的汇编生成或编译器,应该说非常非常不智能,它没有做一些像代码位置上的调整,或者没有做这种代码的指令的重排,就导致了比如我们刚才看到的 error 的错误信息,他直接把所有的错误信息或这些字符串全部插入到了正常的流程当中。带来了什么问题?带来了我们的 L1 的 cache miss 的大量提高,因为 L1 的 cache 是会很大程度上影响到我们的执行性能、运行性能,所以就导致了性能的下降。

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

如何解决这个问题?你们可能会认为,编译器的问题是不是无法解决。后来我们用了个非常 hack 的办法,既然编译器不会去做代码重排,我们就只能自己做。我们自己把所有的错误都定义到了正常 return 语句的后面,在出错的时候用 Go to 跳转到后面,跳转到 label 上。大家可能在写代码或者学的时候都会听说过说 Goto 要慎用,尽量别用。但是在这种场景下,我们只能这么做。这个时候 Goto 语句被直接编译的时候,生成一条汇编的 jmp 指令,最后测出来的性能比之前的旧的版本即直接 return error 还要好。因为它的 cache 的 miss 直接从大概之前的 2.4 降到了现在的 1.8,又提升了很多。

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

这个是一个很有意思的例子,也体现出了在 Go 上面我们想要做深度优化其实非常的困难。

零成本抽象

还有一个就是在 Go 里面其实没有零成本抽象概念。零成本抽象的意思就是,如果我们没有用到的东西,是不需要为之付出代价的;而如果我们用到的东西,不管是编译器、标准库还是第三方库的提供者,都应该是做到最好的,不可能做得更好。可能写 C++,还有写 Rust 的同学比较了解这个概念,但是在 Go 里面是没有的。

Thrift 编解码抽象

而为什么说 Go 里面没有零成本抽象概念,举个例子,我们做 Thrift 的编解码抽象,那么 Apache 官方的 Thrift,是支持很多种不同的 Transport 和 Protocol 组合。底层传输层,还有上层的序列化层,它其实是有很多不同的协议的文章来源地址https://www.toymoban.com/news/detail-455435.html

到了这里,关于字节跳动在 Rust 微服务方向的探索和实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 字节跳动 Spark Shuffle 大规模云原生化演进实践

    Spark 是字节跳动内部使用广泛的计算引擎,已广泛应用于各种大规模数据处理、机器学习和大数据场景。目前中国区域内每天的任务数已经超过 150 万,每天的 Shuffle 读写数据量超过 500 PB。同时某些单个任务的 Shuffle 数据能够达到数百 TB 级别。 与此同时作业量与 Shuffle 的数

    2024年02月04日
    浏览(42)
  • 演讲预告|字节跳动云原生大数据发展、AIGC 新引擎、运维管理实践

    出品人:李亚坤|火山引擎云原生计算技术负责人 专题简介: 大数据已成为企业数字化转型中, 支撑企业经营和业绩增长的主要手段之一。通过升级云原生架构,可以为大数据在弹性、多租户、敏捷开发、降本增效、安全合规、容灾和资源调度等方向上带来优势。传统的大数

    2024年02月11日
    浏览(38)
  • 【字节跳动青训营】后端笔记整理-3 | Go语言工程实践之测试

    **本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金:🔗Go语言工程实践之测试 | 青训营 目录 一、概述 1、回归测试 2、集成测试 3、单元测试 二、单元测试 1、流程 2、规则 3、单元测试的例子 4、assert 5、覆盖率

    2024年02月15日
    浏览(45)
  • 探索全球DNS体系 | 从根服务器到本地解析

    DNS 发展 DNS(Domain Name System)的起源可以追溯到互联网早期。 早期的挑战: 早期互联网主要通过IP地址进行通信,用户需要记住复杂的数字串来访问网站。 需求的催生: 随着互联网的扩大,更简单、易记的命名系统的需求逐渐增大。 创建DNS的动机: Paul Mockapetris和Jon Postel于

    2024年01月24日
    浏览(40)
  • 字节跳动高频题目(1)

     3,1,42,200,15 121,128,49,25,88 5,146,70,2,4 21,33,55,27,560 11,20,31,53,236 300,26,215,279,438 135,148,9,169,76 22,101,14,54,56 72,206,152,80,39 46,62,104,122,179 3. Longest Substring Without Repeating Characters Medium Given a string  s , find the length of the  longest   s

    2024年04月28日
    浏览(37)
  • 字节跳动春招——特征提取

           小明是一名算法工程师,同时也是一名铲屎官。某天,他突发奇想,想从猫咪的视频里挖掘一些猫咪的运动信息。为了提取运动信息,他需要从视频的每一帧提取“猫咪特征”。一个猫咪特征是一个两维的vectorx, y。如果x_1=x_2 and y_1=y_2,那么这俩是同一个特征。    

    2024年02月07日
    浏览(46)
  • 字节跳动懂车帝一面

    自我介绍 3分钟 项目介绍 10分钟 完单率解释 广告计费和消耗 AB实验一般怎么做? 常见AB策略有哪些类型? 进行AB的策略是如何寻找? 决定要不要AB,通常是有新的能力/产品上线,预计对业务的核心关注指标有收益,需要用实验证明有收益可扩量 AB怎么分组,以及各自多少流

    2024年02月08日
    浏览(51)
  • 【2023】字节跳动 10 日心动计划——导航

    关于该专题的刷题已整理完毕,以下是内容导航。 第一关:单词替换、二叉树最大高度 第二关:最小体力消耗路径、缺失的第一个正数 第三关:最长有效括号、有序数组的平方 第四关:买卖股票的最佳时机、打家劫舍 II 第五关:字符串的排列、和为 K 的子数组 第六关:环

    2024年02月12日
    浏览(44)
  • 字节小程序踩坑-uni-app字节跳动小程序运行

    运行-运行到小程序模拟器-运行设置 运行-运行到小程序模拟器-字节跳动开发者工具  注意:抖音小程序不会像微信小程序自动打开!!!! 复制提示的地址 手动打开抖音小程序 点击导入项目,把地址复制到项目目录,点击导入即可 现在修改改HBuilderX的内容并运行,抖音小

    2024年02月14日
    浏览(47)
  • 分享一道字节跳动后端面试算法题

    题目: 给你一个字符串s,可以将任意一个字符转为任意一个小写字符,这个操作可有m次,问转化后的字符串中最长的相等子串长度。 案例: s=\\\"abcdac\\\" ,m=2,2次操作,可以转化为\\\"abcccc\\\" ,最长是4,返回4。 分析: 题目很好理解,但是如果对算法掌握不是很透彻或者是对滑动

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包