php发展

首页 » 常识 » 诊断 » RustConAsia实录Rus
TUhjnbcbe - 2021/1/22 14:15:00
北京白癜风去哪家医院         http://yyk.39.net/bj/zhuanke/89ac7.html

作者介绍

hawkingrei(王维真),中间件高级开发工程师,开源爱好者,TiDBTiKVContributor。

WaySLOG(雪松),Rust铁粉一枚,专注中间件,bugcreator。

本文根据hawkingreiWaySLOG在首届RustConAsia大会上的演讲整理。

今天我们会和大家聊聊Rust在我们公司的二三事,包括在公司产品里面用的两个工具,以及雪松(WaySLOG)做的CacheProxy——Aster的一些经验。

图1

十年前,我司刚刚成立,那时候其实很多人都喜欢用PHP等一些动态语言来支持自己的早期业务。用动态语言好处在于开发简单,速度快。但是动态语言对代码质量、开发的水平的要求不是很高。所以我来到公司以后的第一个任务就是把我们的PHP改写成Golang业务。在我看了当时PHP的代码以后的感受是:动态语言一时爽,代码重构火葬场。因为早期我司还是个人网站,PHP代码质量比较差,代码比较随意,整套系统做在了一个单体的软件里,我们称这个软件是一个全家桶,所有的业务都堆在里面,比较恶心。所以导致早期我司的服务质量也是非常差,观众给我们公司一个绰号叫「小破站」。

但是随着规模越来越大,还上市了,如果还停留在「小破站」就十分不妥,因此我们开始用Golang对服务进行一些改进,包括开发一些微服务来稳定我们的业务。通过这些改造也获得了很好的一个效果,因为Golang本身非常简洁,是一个带GC的语言,同时还提供了goroutine和channel一些功能,可以很方便的实现异步操作。但随着业务规模变大,也出现了一些Golang无法支持的一些情况。于是,我们将目光转向了Rust。

1.RemoteCache

RemoteCache是我们第一个Rust服务。该服务是我们公司内部的一套Cache服务。

在具体介绍这个服务之前,先介绍一下背景。首先在我们内部,我们的代码库并不像普通的一些公司一个项目一个库,我们是大仓库,按语言分类,把所有相同语言的一个业务代码放到一个仓库里,同时在里面还会封装一些同一种语言会用到的基础库,第三方的依赖放在一个库里面。这样所有的业务都放在一个仓库,导致整个仓库的体积非常巨大,编译也会花很多的时间,急需优化。

图2

此时,我们用到了两个工具——Bazel和Gradle,这两个编译工具自带了RemoteCache功能。比如你在一台机器上编译以后,然后换了台机器,你还可以重新利用到上次编译的一个中间结果继续编译,加快编译的速度。

还有一个是叫Prow的分布式CI/CD系统,它是构建在K8s上运行的一套系统,来进行我们的一个分布式编译的功能,通过上面三个工具就可以来加速我们大仓库的一个编译的效率。但是,大家也看到了,首先中间一个工具,Bazel跟Gradle他需要上传我的一个中间产物。这样就需要远端有一个服务,可以兜住上传结果,当有编译任务时,会把任务分布在一个K8s集群里面,就会同时有大量的请求,这样我们就需要有个RemoteCache的服务,来保证所有任务的cache请求。同时,因为我们使用了Bazel跟Gradle,所以在办公网里面,很多开发也需要去访问我们的RemoteCache服务,来进行编译加速。

所以对我们RemoteCache服务的负担其实是很重的。在我们早期的时候,因为一些历史原因,我们当时只有一台服务器,同时还要承担平均每天-QPS的请求,每天的量大概是TB左右,并且仓库单次编译的大小还会不断的增加,所以对RemoteCache服务造成很大压力。

1.1KubernetesGreenhouse

我们当时在想如何快速解决这个问题,最开始我们的解决方法是用K8s的Greenhouse开源服务(

1
查看完整版本: RustConAsia实录Rus