Rust 热点| Discord 为何从 Go 切换到了 Rust

 

关注上方蓝字关注咱们后端

理清混沌,觉醒心智天地缓存


Discord 发文介绍了他们从Go到Rust的过程,能够点击阅读原文查看全文。这里只作一个关键的摘要。性能优化

Discord从未害怕采用看起来颇有前途的新技术。 例如,Discord是Elixir,React,React Native和Scylla的早期采用者。 若是一项技术颇有前途并能带来优点,那么Discord不介意处理前沿技术的固有困难和不稳定。 这是Discord经过不到50名工程师迅速达到2.5亿用户的方法之一。微信



读取状态服务延迟并发



这次切换到Rust的服务是「读取状态服务」。其惟一目的是跟踪用户已阅读的频道和消息。 每次用户链接到Discord,每次发送消息和每次阅读消息时,都会访问“读取状态”。 简而言之,“读取状态”是最忙的地方。 若是要确保Discord始终都感受超级丝滑,就须要确保读取状态服务的性能。
app

该服务以前是使用Go实现的。在大多数状况下,速度很快,可是每隔几分钟,就会看到大量的延迟峰值,这不利于用户体验。 通过调查,Discord团队肯定峰值是因为Go的核心功能引发的,就是内存模型和垃圾收集器(GC)。框架


迁移到Rust
工具



读取状态服务以前大约每2分钟就会出现延迟和CPU峰值。通过Discord团队调查,Go会强制至少每2分钟运行一次GC。 随后团队不得不缩小了缓存容量,达到了某种平衡,不会频繁触发Go的垃圾回收,所以下降了延迟,从而继续使用了一段时间。性能

随着Rust在Discord的其余组件得到了愈来愈多的成功,Discord团队共同决定要用Rust彻底构建新服务所需的框架和库。 而读取状态服务体积小且比较独立完整,所以很是适合移植到Rust,但该团队也但愿Rust能够解决这些延迟峰值。 所以,他们开始了将“读取状态”移植到Rust的任务并改善用户体验。测试



Rust vs Go



事实证实,迁移很是成功。

1. 即便仅进行基本优化,Rust仍能赛过超级手动调整的Go版本。 

2. 与Go进行的深刻研究相比,这充分证实了用Rust编写高效的程序是多么容易。

3. 通过一些性能分析和性能优化后,在每一个性能指标上都击败了Go。 在Rust版本中,延迟,CPU和内存都更好。




Rust性能优化包括



1. 将LRU缓存中的HashMap替换为BTreeMap达成优化内存的目的。

2. 将最初的metrics库换成了现代的Rust并发的metrics库。

3. 减小内存拷贝的数量。

而且,Discord团队随后增长了缓存容量,测试后,取得了至关满意的结果。



Rust在Discord内部状态:




1. Discord内部技术栈不少地方使用Rust:游戏SDK,Go Live的视频捕获和编码,Elixir NIF,若干后端服务等等。

2. 在开始新项目或软件组件时,优先考虑使用Rust。 固然,只在有意义的地方使用它。

3. Rust 除了性能,在工程性方面还极具优点。

4. Rust 生态系统和工具很是出色,而且背后蕴藏巨大的动力。

5. 若是你喜欢Rust,能够考虑来Discord工做。



以为文章不错,点个赞吧!                                                                         文章好看点这里


本文分享自微信公众号 - 觉学社(WakerGroup)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索