< 返回我的博客

ddbackhome 发表于 2023-05-25 00:02

Tags:心得体会

写这篇文章仅此记录这几个月的rust项目开发历程,留下一些回忆,同时也做一些技术上的简单总结。 毕业十几年一直都在一线做coding工作,中间有很多次机会转管理,自己都放弃了,主要还是坚持那份热爱,但35岁后还是逃不过那份国内技术圈氛围所带来的焦虑。

去年年底以前的一个同事找到我,问我有没有时间重构一个产品,这个产品是用go写的,产生了不错的效益,但是现在产品架构存在一些问题,做拓展很困难,导致一些新的功能无法添加。同事想让我对产品进行重构,同时添加一些新的功能,至于是用go还是其它的语言来实现,由我来自己决定。 经过多次的电话沟通,我对他这个产品也产生了一定的兴趣,打算利用业余的时间参与进来。开始我本来打算使用go进行重构的,但是我这个人喜欢尝试新的东西,我就把关注点放到了rust上来,经过一番调研后,我觉得rust很适合做这个产品。我把想法和同事沟通后,他也比较认同,就这样我开始了自己的rust爬坑之旅。

由于第一次使用rust做项目,在开始之前还是要系统的学习了一番,在这里感谢《Rust语言圣经》的作者无私的分享,不得不承认学习曲线还是很陡的,学起来也是磕磕绊绊,尤其是Rust的生命周期开始也是给我带来了很大的困扰,不过好在坚持了下来,慢慢的找到了状态。 学习完基本的语言规则后,就开始搭项目框架了,开始我根据项目特点选择了tokio做tcp框架,使用actix做api开发,选择sqlite做数据持久化,利用周末和春节空余的时间很快就把基本的原型给弄出来了,刚开始还很得意,觉得rust也没有那么难嘛,现在想起来当时还是大意了!

春节复工后工作上发生了一些变化,公司开始降薪,自己所在的行业觉得也没有很大的发展,日复一日做的工作尤其乏味,所以就想有一段空余时间去规划一下未来,就这样向公司提了离职,正好同事说你既然离职了正好全身心的投入到rust的项目中去,我想了想也是,正好利用这段时间把产品搞出来,也算是利用这个机会把rust的水平提高一下,就这样我3月1号离开北京和同事在他所在的城市汇合开始搞产品开发,我们搞了一个电竞酒店房间,一人一张桌子就开始了。

我们的分工是他做产品规划和前端,我做客户端和服务端。记得第一天我在rust上遇到的第一个难点就是tls的连接问题,我使用的是rustls库,基本的tls连接都没有问题,但是在测试的过程中发现对一些特定的证书会直接报错,导致连接被断开,和预期不符,这个问题搞了很久,加上网上关于这块的资料很少,基本上想放弃使用go来写了,因为go这块是没有问题的,这里要吐槽一下chatGPT,开始有些问题去问chatGPT,感觉很快给出了答案,觉得真强大,但是慢慢的会发现,chatGPT给出的rust基本上都有问题,很多编译不通过,同时chatGPT很容易把rust和python搞混淆,经常把python的库当做rust来搞,还一本正经的给出实例代码,搞的很无语,我想还是rust的语料太少了,chatGPT也是巧妇难为无米之炊。tls问题搞定后,接下来的开发还是比较顺利的,随着对rust越来越熟悉,开发的进度上也提升了不少,后面就是基本上处理业务问题了。

经过1个多月没日没夜的开发(基本上每天都要工作12-14小时),终于到了快要提交版本给客户的日子,但是就在要发布的前一天,遇到了代码编译的问题,这个问题足足困扰了我很长时间,一开始打算在macos上使用macos-cross-toolchains来做交叉编译,编译出linux和windows版本,但是由于需要静态连接openssl,在macos上一直报错编译不过,经过一次一次反复实验和查找资料,最终使用docker结合musl的方案来完成了最终的版本编译,但是发现rust编译确实有点慢,这个和go比起来感觉确实有点差距。 编译搞定了就想着快点给客户试用,觉得就可以大功告成了,殊不知后面还有千难万险在等着自己。第一版出来后的那个晚上这辈子绝对不会忘记,编译完成后就立马发给客户试用,客户开始也很高兴,觉得终于做出东西来了,我和小伙伴还出去吃了一顿,吃完饭后就在回去的途中接到用户电话说出了问题,我们开始觉得问题应该不大,应该很快就能解决,但是还是想得太简单了。回到酒店开始打日志来定位问题,结果看了足足两个小时依然毫无头绪,不知道问题出在什么地方,只要并发量一上来铁定出现错误,但就是找不到具体原因,开始一直觉得是锁的问题,反复验证也排除了,就这样一次一次️看日志搞到了凌晨3点,还是没有结果,同事后来说那个时候都想放弃了,他开始怀疑是不是rust本身语言机制的问题,我也隐隐有些担忧,但这个时候我还是没有放弃,决定再从头到尾把日志给排查一篇,终于黄天不负有心人,在快5点的时候,终于让我发现了一些端倪,由于前期测试的过程中接口没有考虑到重复id的情况,导致并发量一上来id就会重复,这个问题还真是致命,找到了问题就好办,马上修改重新发版了,一直搞到上午10点才去休息,这一夜得经历真是跌宕起伏,让我难以忘记。

后面的开发相对来说比较顺利了,但有一些问题也花了不少心思取解决,首选就是性能的问题,我发现sqlite搞大并发还是不行,由于它写的时候会锁库,并发量上来后很容易崩溃,后来就直接写了一套key-value的存储接口,勉强能把大并发给抗下来,其次就是分布式锁的问题,刚开始本来不想使用分布式锁的方案,但客户确实对性能这一块很在意,不得已就用上了,但这个里面坑真多,一不小就会死锁,而且排查起来很困难,这个以后估计要搞一个无锁的方案才放心。 经过两个多月高强度的开发,自己感觉rust的水平也是慢慢得到提升,就可以说一下使用rust开发的感受:

  1. 使用rust确实能提高代码的质量,由于我使用过多年的php/js/node等语言,这些动态语言说实话写起来速度很快,但是也容易出问题,而rust只要编译过了,bug出现的概率会很小。
  2. rust的性能确实不错,那拿我这个苹果笔记本来说,如果我搞java开发cpu就很容易给干上去,风扇呼呼的响,而用rust的时候很少出现这个情况,风扇的声音基本上听不到,看来rust还是要环保一些。
  3. 用vscode搞rust开发确实比较舒服,由于自己多年都使用vim搞开发,开始的时候在vscode里面觉得很不适应,但是在用了neovim的插件后就感觉很方便了,加上rust-analyzer的辅助,效率也是越来越高。
  4. rust的文档我得吐槽一下,对于一个初学者来说,很多库的文档做的确实不完善,例子非常少,找起函数使用的参数说明很不方便,这个里面有个例外就是tokio官网里面的文档确实做的很细致,要点个赞。
  5. 相对于go来说,rust在国内的生态要差一些,这几年go被几个大厂搞的很java了,基本上很多场景都有成熟的方案,这一点上rust还有很长的路要走。
  6. rust还很年轻,值得我一直陪伴下去。

评论区

写评论
lizhiyu-me 2023-06-02 00:21

👍

ChenGuoHui 2023-05-25 14:03

辛苦半夜还在写心得,可以分享问题的解决方案吗 :)

1 共 2 条评论, 1 页