共计 10382 个字符,预计需要花费 26 分钟才能阅读完成。
近日,Qcon 寰球软件开发大会 2022(上海站)圆满闭幕,大会是由 InfoQ 中国主办的综合性技术盛会,近百位国内外技术大咖现场分享前沿技术案例与翻新实际。本文整顿自字节跳动火山引擎基础架构服务框架工程师 吴迪 于大会上的分享内容,主题为《字节跳动在 Rust 微服务方向的摸索和实际》。
本次分享内容次要分为以下三个局部:
- 咱们为什么抉择了 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%?”咱们认为不可能,咱们所有序列化、反序列化逻辑都没有改,只改了这一行。过后咱们也很纳闷,认为是不是业务方本人测试环境有问题,起初咱们查了半天,最初终于发现了状况。
新版本代码
旧版本代码
大家能够看到这个是新的代码生成进去的汇编,在 Go 外面它的汇编生成或编译器,应该说十分十分不智能,它没有做一些像代码地位上的调整,或者没有做这种代码的指令的重排,就导致了比方咱们方才看到的 error 的错误信息,他间接把所有的错误信息或这些字符串全副插入到了失常的流程当中。带来了什么问题?带来了咱们的 L1 的 cache miss 的大量进步,因为 L1 的 cache 是会很大水平上影响到咱们的执行性能、运行性能,所以就导致了性能的降落。
如何解决这个问题?你们可能会认为,编译器的问题是不是无奈解决。起初咱们用了个十分 hack 的方法,既然编译器不会去做代码重排,咱们就只能本人做。咱们本人把所有的谬误都定义到了失常 return 语句的前面,在出错的时候用 Go to 跳转到前面,跳转到 label 上。大家可能在写代码或者学的时候都会据说过说 Goto 要慎用,尽量别用。然而在这种场景下,咱们只能这么做。这个时候 Goto 语句被间接编译的时候,生成一条汇编的 jmp 指令,最初测进去的性能比之前的旧的版本即间接 return error 还要好。因为它的 cache 的 miss 间接从大略之前的 2.4 降到了当初的 1.8,又晋升了很多。
这个是一个很有意思的例子,也体现出了在 Go 下面咱们想要做深度优化其实十分的艰难。
零老本形象
还有一个就是在 Go 外面其实没有零老本抽象概念。零老本形象的意思就是,如果咱们没有用到的货色,是不须要为之付出代价的;而如果咱们用到的货色,不论是编译器、规范库还是第三方库的提供者,都应该是做到最好的,不可能做得更好。可能写 C++,还有写 Rust 的同学比拟理解这个概念,然而在 Go 外面是没有的。
Thrift 编解码形象
而为什么说 Go 外面没有零老本抽象概念,举个例子,咱们做 Thrift 的编解码形象,那么 Apache 官网的 Thrift,是反对很多种不同的 Transport 和 Protocol 组合。底层传输层,还有下层的序列化层,它其实是有很多不同的协定的,比方 transport 层,有个叫 framed 的 transport,有个叫 buffered 的 transport,甚至还有一些像 memory 间接在内存外面。除了 transport 还有 protocol,当初基本上是两种:Binary 和 Compact。大家晓得,它有多种不同的组合。官网实现它为了去反对多种不同的这样的组合,用了 Go 外面的 interface 去做了形象,然而咱们前面把形象给去掉了,咱们间接依赖了一个具体的 protocol 的实现,也就是依赖了一个具体的 struct。
Interface 的代价
那么为什么咱们不必它的形象?因为形象是有代价的。代价就是在 Go 外面,它的 interface 是动静散发的,即运行时通过类型的元数据和指针,去动静调用所需接口,它可能会造成多一次的内存寻址。
但这并非最次要的,最次要是它会影响到 inline。而且在 Go 外面没有提供一种零老本形象的计划,它不像 Rust 外面有一个 box dyn,与 interface 很像。还有一种是动态编译式的,做动态散发,在编译的时候间接把类型给单例化进去了,这就是一个零老本的,然而 Go 外面没有。
Sonic
还有一个我的项目其实是十分有意思的,咱们 CloudWeGo 社区开源了一个叫做 Sonic 的我的项目,应该是在 Go 外面最快的 JSON 的序列化、反序列化的这么一个我的项目。这个我的项目为什么快?因为它的秘诀就是世界上最快的 Go 代码,不要用 Go 写,间接用汇编和 C 写就完事了。大家能够看 Github 下面代码语言的统计,实际上 Go 占 27.1%。
大家会发现其实所有的 Go 的代码外面,基本上也是通过 Go 去生成汇编。所以这就是咱们的论断,世界上最快的 Go 代码,不要用 Go 写,用汇编写就完事了。
性能最好的 Go JSON 库
但只管 JSON 库用了十分多的黑科技去优化,然而咱们能够看到,绿色的这一条是 Rust 外面比拟经典的,叫 serde 库。serde JSON 这个库就是 benchmark 的后果,咱们做 benchmark 发现它还是比不过这个 rust 的库。所以咱们前面下定决心,想要去钻研一下 Rust 方向,去尝试一下落地。
Rust 历史
讲到 Rust 这个方向的语言,必定要理解一下它的历史。Rust 一开始是由一个名叫 Graydon 的人开发进去的,他是一个 Mozilla 的职业的编程语言的工程师。Mozilla 过后想要去实现一个叫 Servo 的一个引擎,感觉这个语言很有价值,决定去应用它去资助了这个语言。
在 2015 年的时候,Rust 公布了 1.0 的版本。1.0 版本其实就代表了一个稳定性的承诺。在 2018 年公布了 1.31 版本,1.31 版本代表的是生产力。在 edition 2018 时候引入了 Async await 异步的 Rust,在当初来看,我给他的评估是将来可期。
Rust 2024
Rust 在 2024 有一个布局叫做 scaling empowerment,也就是扩大受权。为什么叫扩大受权?因为这就是我在专场一开始问大家的问题,说 Rust 的指标、愿景是什么?它的愿景是 empower everyone to build reliable and efficient software,所以它要受权每个人去发明牢靠并且高效的软件。
在 2024 的布局外面,因为其实大家也都据说过 Rust 的学习曲线比拟平缓,目前 Rust 官网其实也曾经理解到了一些特地是 async 的 Rust 存在一些应用上的问题,并且也非常重视这个事件。所以它 2024 年的指标次要就是为了让 Rust 更加好用,更加易用,并且可能落地更多的我的项目。
Rust 三大劣势
Rust 在咱们看来有三大劣势:性能、平安、合作。性能和平安可能大家都会比拟理解,或者会听得比拟多一些。
性能
比方这是一个 debian 搞的 benchmark game 的一个后果,我选的是一个纯计算的 case 的后果。在外面能够看到,Rust 语言其实是遥遥领先其余几个语言,特地是 Go 的,大略有 4 倍的晋升。
有同学会问,为什么 Rust 会比 C 和 C++ 性能还好,其实这也是因为 Rust 它对于程序员的一个要求,因为它的代码的限度更加严格,这就间接导致了编译器能够做更加激进的一些优化。所以它的性能在有局部时候是能够超过 C 和 C++ 的。
安全性
其实在网上有很多相干的材料,我也不过多赘述。我只讲最重要的一个论断,就是在 Rust 1.0 之后,在非 unsafe 代码中不可能呈现内存平安的问题。
这个论断可能大家听起来感觉有点云里雾里,其实它的一个推论更加重要,就是所有的内存和并发平安问题都是 unsafe 代码导致的。这就间接示意,如果在线上一个服务呈现了 coredump,或者呈现一些内存平安并发平安的问题,不必去看 safe 代码,间接看 unsafe 代码就好。因为 Rust 外面 unsafe 代码是十分大量的,它不像 C 和 C ++,能够说全都是 unsafe,如果去找可能不晓得要找到何年何月。然而在 Rust 外面,只有去看变更中新减少了哪些 unsafe 的代码,这些代码必定就是问题的源泉,这就是 Rust 的安全性所带来的益处。
合作
我认为 Rust 非常适合合作,是因为它的确是一门真正工程实际进去的语言。它有十分智能的编译器,有欠缺的文档,有十分齐全的工具链,以及成熟的包治理。而且最重要的一点,你能够齐全信任别人的代码,这个是在 C 和 C++ 甚至在 Go 外面都做不到的。
如果有同学有 review 过其余团队成员的 C 或 C++ 代码的教训或体验,应该能理解到,当你 review 这种 C 和 C++ 代码的时候,很多水平上基本看不出来它到底哪里会搞了个什么野指针进去,或搞了个内存平安问题进去,只有在线上真正 coredown 的时候,而且 coredown 的中央很可能是在十万八千里之外,你基本联想不到是这段代码导致的。因而很多时候没有方法去信任别人代码。然而在 Rust 外面没有关系,只有它能编译过它,代码就是平安的。所以咱们在 review 的时候,只须要去关注那些业务的逻辑是否正确就能够了。
Rust 开发者调研
在 Stack Overflow 上,每年都会有开发者调研。Rust 曾经间断七年成为最受欢迎的语言,而且能够看到它离第二的差距挺显著。
业界的利用案例
我也简略介绍一下在业界上有哪些利用案例,因为一个语言除了在社区利用的比拟广之外,被企业承受也是一个很重要的指标。首先在 Meta(Facebook)承受,它曾经是一个后端正式的反对语言。在咱们公司字节跳动,在很多场景上也曾经用到了 Rust,特地是飞书。如果有用过飞书的企业能够理解一下,飞书所有的逻辑全都是 Rust 编写的,在 Google、蚂蚁金服还有上面有很多的企业。
Rust for Linux
Rust 的利用在最近也是越来越广。还有一个很重量级的我的项目叫做 Rust for Linux,这个是 Linux 内核至今为止,惟一承受的除了 C 以外语言,应该是相当重量级的一个代表。
和 C++、Go 比照
我再简略做一个 C 和 C++ 和 Go 的比照。我感觉学习难度上 C++ 和 Rust 都是高,性能上 C++ 和 Rust 也都是高。然而安全性下面,Rust 其实是完爆这两个其余语言的,特地是在合作上。正如之前提到过的,对于 C++ 来说没有一个原生的包管理工具,同时它也没有方法让你去信任别人的代码。应用老本下面,我综合认为 C++ 应用老本比拟高,Go 和 Rust 应用老本都是中等。为什么说 Rust 应用老本是中等?因为应用老本不仅仅是开发的时候所要付出的老本,它还波及到一个服务要上线之后,要让它进入到稳固状态两头的 debug 所须要的老本,以及你如果出事变所带来的一些损失,这些都是要考量在内的。综合下来,我认为 Rust 它的应用老本是中等。
这里又有一个问题了,为什么 Rust 这么好?它和 C++ 是同一个 level 的语言,为什么 C++ 做不到这么好?当然,其实咱们都说软件工程外面没有银弹,这是因为 C++ 的历史包袱的确太多了。Rust 胜在没有历史包袱,所以它设计的时候就不像 C++ 必须要兼容那种旧的应用模式。不能说更新个 C++21,旧的代码全都编译不过,那么大家谁违心做呢。Rust 其实有点占了这方面劣势。
咱们做了什么
公司内(之前)生态状况
接下来我为大家介绍一下,咱们字节跳动做了些什么。这是一个很悲伤的故事、很悲伤的数字。在咱们开始做的时候,其实公司内的生态是 0,服务端什么都没有,什么都要本人开始建。
如何建设生态
过后思考这个问题,首先是得让大家能用起来,这就波及到了一些编译打包和运行的基础设施。我置信每个公司都会有本人的编译打包流程、上线的流程以及运行的环境。这些是比拟要害的一些设施,包含内网的一些像 crates.io 还有 docs.rs 这些开发所须要的基础设施,以及一些根底库和开发框架。可能每个公司的环境不一样,我介绍的是一个大略的流程,这个流程如果有公司想要去尝试,是能够一起来参考一下的。
根底库
根底库大略是像日志、监控、链路追踪、mysql、redis、动静配置、mq 这些属于咱们认为非必须的、十分重要的一些根底库。这些可能是须要推广方,比方咱们团队是作为推广方,去把这些全副建设起来。
接下来剩下一些非必须的根底库,可能是某一些业务独自的库,就能够发动群众的力量,因为它只有最根底的这些货色。比方它可能实现一个 CRUD 的根底服务,剩下的货色能够一边在开发业务过程当中,一边本人去写。
开发框架
咱们也筹备了 3 个开发的框架:
第一个,基于 Axum 的 Web 框架。Axum 算是 tokio 当初比拟火的一个官网的 HTTP 的 Web 框架。
第二个,RPC 框架,反对了 GRPC 和 thrift,叫做 Volo。曾经开源在 CloudWeGo 的组织上面了,如果之后有 RPC 的需要能够间接来应用这个框架。第三个,异步的运行时的 Monoio 框架。这个次要是思考到提供给一些性能十分要害的业务以及基础设施,就是基础架构的服务去应用。它的益处在于它采纳 Thread Per Core 模型,这样就能够解决 Tokio 的很多问题,比方它的 future 必须加 Sync 的一个问题。因为 thread per core 的状况之下,它能保障一个 task 肯定在一个线程中被运行,这样很多时候就不须要 send 加 sync 的束缚,能够间接用 TLS(thread local storage)或者其余的这些技术,以及一些无锁的技术去编程,这能够很大水平上进步性能。第二个就是它采纳了 Linux 最新公布的 io_uring 技术去做 IO 层,如果有对于性能要求十分高的同学能够去理解一下。
发现的问题
咱们过后毕竟是吃螃蟹,必定也遇到了一些问题。咱们次要遇到开源库的 bug,以及开源库不齐全满足需要的问题。比方最近咱们就遇到了一个业务,它在应用的是 Snappy 库,做压缩和解压缩的库。他发现压缩和解压缩的 writer 他是不能复用的,咱们前面就本人给他提了 PR 去反对上了。
所以在吃螃蟹这个阶段,可能须要可能本人去解决问题,要去提 PR,以及要本人 Fork 一些开源库进去去用的。这个要做好心理准备,因为这是咱们真正实际上遇到的问题。还有一个可能跟技术没有特地强关联的问题:咱们发现有很多一线的同学其实特地喜爱 Rust、特地想用 Rust。正如方才提到,Rust 是 stuck workflow 上最受开发者青睐的语言榜榜首,曾经间断第 7 年。然而很多的 leader 管理者会放心,咱们团队只有一个人会 Rust,如果这个人他转岗了或到职了,这个服务是不是就没有方法保护了?这可能是很多的 leader 会放心的问题。
如何推动落地
这时其实就须要咱们作为推广方去染指,并且去帮忙他去开发一些我的项目。这个时候可能不会让他去开发一个业务的服务,因为业务服务毕竟有时须要整组一起探讨、一起拍板之后能力抉择某个技术站,然而集体的我的项目是能够用的。
很多对 Rust 十分感兴趣的的工程师,只是短少有一个人带头,或者短少一个契机。最重要的一点就是要寻找一些典型的业务去独特地开发、去取得收益。在咱们看来,这些典型的业务有一个特色,就是 proxy 的业务,它是一个代理类的业务,重计算,然而逻辑是比较简单的,因而尽管咱们在推动落地时须要一些后期投入,然而是值得的。
实际:nightly + GAT + TAIT
具体的收益稍后为大家分享。这里我先介绍一下咱们一些实际中的感悟。不要视 nightly 为洪水猛兽,nightly 是真香。nightly 有很多很多的个性是十分棒的,比方像刚稳固的 GAT,还有 TAIT。这两个个性是能大大的去升高推广 Rust 的阻力。
一个 Timeout 中间件
咱们能够看一下比照是在没有 TAIT 状况之下,也就是 tower。可能写 Rust 的同学都晓得有 tower 这么一个中间件形象的库,这里大家不论会不会 Rust,能够不去过多地关注它的细节。大略看一下在 tower 外面,我想要没有老本也没有性能损耗的去实现一个 Timeout 的超时中间件,须要满满两屏的代码。
然而如果用咱们的采纳了 GAT 加 TAIT 这两个个性之后,代码量只须要这么多,这其实是一个非常明显的比照。其实咱们很早就开始用了。
所以在理论推广的时候,能够去思考把这些有用的个性都给关上。特地是有一个个性叫 async fn in trait,在 trait 外面能够定义异步函数了。这个个性曾经在 nightly 上达到了 MVP,尽管存在一些问题,但起码是可用的状态了。
落地成绩
接下来为大家介绍一下咱们的落地的一些成绩。首先是有一个 proxy 类的业务,它的 CPU 的占用从大略 630% 升高到了 380%,简直是晋升了一倍。第二个就是它的 memory,也就是它的内存占用大略从 9GB 降到了 2GB。而后它的 P99 和 AVG 也有十分大量的晋升了。
- 业务 A(Proxy 类)
- CPU Usage 630% -> 380%
- MEM 9GB -> 2GB
- P99 150-200ms -> 20-35ms
- AVG 4-5ms -> 1.5ms
- 业务 B(有大量业务逻辑)
- CPU 400% -> 130%
- 业务 C
- CPU-50%,MEM-95%
能够看到右边这张图,红线这条线是咱们上线的工夫点,在之前和之后,它的尖刺有很显著的比照。另外一个业务 b,有大量的业务逻辑,它大略是 CPU 占用从 400% 降到了 130%,大略三倍的晋升。另外一个业务 c 也是有很显著的晋升。
还有某一个比拟重要的线上业务,它的晋升量也是非常明显。举个例子,它的老本是升高了 50%。大家就会问:这些数据能证实什么、代表什么?我光晓得好,CPU 升高了,memory 升高了,ABG 升高了,提早升高了,它能阐明什么?咱们来简略地算一下。
- 业务 D(线上重要业务):
- 吞吐 +95.96%
- 老本 -48.97%
- avg -14.29%
- p99 -18.18%
- p999 -10.26%
算一算
这是某云的一个价格截图,64 核 128G 的机器,一个月的价格是 6262 元。因为某云买 5 年能够打 3 折,所以我就依照最优惠的计划给大家算。28000 一年,相当于算下来是 437 元 / CPU * 年。业务应用了 1 万个外围,咱们方才计算下来老本减去了 48.97%,我就按 50% 算,节俭 5000 核,相当于一年节俭的数量就是 200 多万。这就是一年省下来老本。
咱们又有同学会说了,你没把开发的人力算上。我再把开发的人力给算上,曾经是一个十分十分高的,简直不可能达到的一个开发的老本了。因为咱们服务大略就花了大略两三个月,写完就重构完了,我就算 6 个月,开发的加办公的老本,我也选了一个十分十分高的值,其实应该是达不到这个值的。如果他是 120 万,他第一年的净收益就是靠近 100 万,再往后每一年都是纯收益了,曾经没有老本了。当然实际上它的收益应该是远不止这个值的,因为 CPU 老本是没有这么便宜的。有做过成本核算、效益核算的同学,可能会比拟理解一些它的老本的值。一个经验值大略是在 1000 一核,能够依照这个值去计算。因为除了 CPU 单纯的 CPU 价格之外,还有网络的老本,比方机房运维人员的老本,其实老本是远不止 437 一个 CPU 的。还有一点,如果 AVG,也就是 latency 提早有升高的状况之下,其实是可能带动业务的增长的。
展望未来:时机与挑战
Rust 现状
Rust 当初的现状:好用。它的确挺好用,它的性能很多,很符合人体工程学,然而它还不够好用。
其次,它的形象能力、表达能力是挺强的,然而它的高阶形象还有些问题,特地是写 Rust。可能用过 HRTB 的同学会晓得,HRTB 配合 GAT 或和 TAIT 应用的时候会有些坑,然而应用场景切实太高阶,基本上业务开发是用不到的,所以也能够承受。第三,Rust 的异步生态当初较为欠缺,然而它和同步的生态存在一些割裂。比方一个函数 Fn,它不能同时是异步和同步的,异步版本和同步版本必须写两个不同的函数。
当然,其实 Rust 官网也曾经感触到了这些问题,都在解决,特地在 2024 的 roadmap 外面都有提到这些问题。像 Niko 也在尝试一个新的计划,它心愿一个函数能够同时是 async 以及 sync 的两个版本。如果调用方是 async,它就会调一个 async 的,在编译时生成一个 async 的实现。他会做这样的一件事件。
还有一些比拟好的音讯是开发者十分青睐,用户的忠诚度是十分高的。我置信写进去的同学应该不会再思考转到转回到其余语言去了,起码我是不会再回去写 go 了。开源我的项目也是爆炸性的增长,特地是这两年,能够显著感觉到越来越多的开源我的项目采纳 Rust。不论是新增我的项目还是重构的我的项目,有越来越多的公司承受开始应用 Rust。
Rust 利用的方向
Rust 其实它的利用的方向十分十分的广,我大略简略列了一下,包含像 Rust for Linux 其实曾经相当于补足了。Rust 利用的最初一块拼图,也就是 OS 层和嵌入式层,都是能够应用 Rust 去写的。还有一个最近很有名很火的一个方向,就是 WebAssembly,基本上 Rust 也属于是第一梯队的,就是最佳的语言了。
面临的挑战
目前面临的一些哪些挑战,第一个是 Rust 的职位不够多,人才不够多,其实是一个互相的关系,如果人才多起来,职位也会多。如果职位多,人才也会多。所以这可能须要的不仅是某一家公司去投入做什么,而是心愿所有青睐 Rust 的程序员,独特地一起去把整个生态建设起来。第二是 Rust 在中国的名声不够响,尽管当初曾经在缓缓地晋升当中了,然而它和 Go 的确还有一些的名气上的差距,通过培训班的数量就能看得出来。
第三是 Rust 短少像 K8S 一样的杀手机利用。这也是大家始终提到的一点,上面是 Rust 官网做的调研的一个图,有 22.51% 的人认为 Rust 是 for the majority of my coding,他们大部分的次要代码都是用 Rust 写的。有 17 % 的人说是本人所有应用的语言中之一,有 18% 的人说他只是偶然去应用。然而这张图其实就阐明了 Rust 语言它是否真的可能产生价值。
再上面这张图是 Rust 官网来问,你感觉 Rust 语言有没有帮忙你真的去实现一些什么货色?有 80% 的人认为 Rust has helped us achieve our goal,Rust 曾经帮忙咱们达到了咱们的指标。然而有一个坏消息是 47% 的人认为用 Rust 是 challenge 的,是有挑战性的。前面有 70%。有 80% 的人认为 Rust 是值得咱们的付出的,以及有 90% 的人认为咱们在将来还违心去应用 Rust。
时机
当初咱们还遇到了一个新的时机,降本增效,以及当初其实大家都对底层技术越来越关注,而 Rust 它的掌控力十分的强,所以在底层技术畛域它是一个十分十分趁手的工具。而且当初 Rust 关注度足够高,社区也是在疾速倒退的过程当中。
拥抱开源,回馈社区
咱们在公司外部也建设了很多的,投入了很大量的工夫精力去开发了一些相干的这样的基础设施。咱们也是取之开源,用之开源。咱们把咱们最外围能力全副都裸露了进去。一个 Volo 是咱们的 RPC 框架,如果有应用有微服务的框架需要的同学或公司,能够思考应用一下。Monoio 方才曾经介绍过了,是一个 Thread Per Core 模型的,应用了 io_uring 的一个超高性能的异步框架。咱们也出了一个对标 tower 的中间件的形象,就是 Motore 间接应用了 GAT 加 TAIT 这两个重要的个性。以及为了解决一些国内家喻户晓的网络问题,咱们也做了一个 proxy 给大家,大家如果常常遇到拉包拉不下来的问题,也能够思考应用一下。
• Volo:https://github.com/cloudweGo/volo
• Monoio:https://github.com/bytedance/monoio
• Motore:https://github.com/cloudweGo/motore
• RsProxy:https://rsproxy.cn/