首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
图文并茂VLAN详解,让你看一遍就理解VLAN
2
做了几年的网工也未必了解VLAN和VXLAN的区别,今天我来告诉你!
3
全网内容最全,质量最高的MPLS及MPLS VPN技术详解,瑞哥力荐!
4
Google BBR拥塞控制算法背后的数学解释 | 深度
5
QUIC 0-RTT实现简析及一种分布式的0-RTT实现方案
6
AGPS定位基本原理浅析
7
Golang语言情怀-第56期 Go 语言标准库翻译 crypto/cipher
8
神锁离线版插件端到端加密比HTTPS更安全
9
基于 TLS 1.3的微信安全通信协议 mmtls 介绍(上)
10
基于 TLS 1.3的微信安全通信协议 mmtls 介绍(下)
11
24位腾讯云专家精彩演讲,4万字《腾讯云技术实践精选集 2021》发布!(附合集下载)
12
浅谈VPC二三,秒懂秒透
13
提速 30%!腾讯TQUIC 网络传输协议
14
25 张图,一万字,拆解 Linux 网络包发送过程
15
nginx http模块数据存储结构
16
多机房多活,多机房平滑迁移架构方案全集(上+中+下)
17
小孩都看得懂的多臂老虎机和汤姆森采样
18
什么是 Go runtime.KeepAlive?
19
Rust 热点| Discord 为什么从 Go 切换到了 Rust
20
用户态 tcpdump 如何实现抓到内核网络包的?
21
一文读懂 | coredump文件是如何生成的
22
网工知识大扫盲——三层交换技术
23
聊聊 top 命令中的 CPU 使用率
24
什么是HDFS的纠删码
25
Linux ptrace 的实现
26
天天讲路由,那 Linux 路由到底咋实现的!?
27
Linux系统研究 - 操作系统是如何管理tcp连接的 (2)
28
一个有关tcp的非常有意思的问题
29
对上一篇文章中tcp问题的进一步思考
30
epoll和shutdown使用不当可能导致死循环
31
socket的SO_REUSEADDR参数全面分析
32
多进程可以监听同一端口吗
33
golang | 是返回struct还是返回struct的指针
34
​TCP 拥塞控制详解
35
C|网络|TCP-BBR拥塞控制剖析
36
如何使用 Go 语言写游戏服务器?
37
Nginx 日志 worker_connections are not enough while connecting to upstream
38
如何用九条命令在一分钟内检查Linux服务器性能?
39
服务器病了吗? Linux 服务器的那些性能参数指标
40
边缘计算比云计算强在哪里?终于有人讲明白了
41
详解边缘计算系统逻辑架构:云、边、端协同
42
边缘计算成为下一个爆发点,云计算巨头和CDN巨头谁会赢?
43
告知你不为人知的 UDP:连接性和负载均衡
44
为什么需要智能网卡?
45
从CDN到边缘计算,近水楼台是否先得月?
46
经典网络还是VPC,开发者作何选择?
47
Linux内核网络udp数据包发送(二)——UDP协议层分析
48
有没有人告诉你—写时拷贝的真相
49
[linux][network]net bridge技术分析
50
软硬件融合技术内幕 进阶篇 (1) —— 从小霸王到云计算

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

理清头脑混沌,觉醒心智天地

Discord 发文介绍了他们从Go到Rust的过程,可以点击阅读原文查看全文。这里只做一个关键的摘要。

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

读取状态服务延迟

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

该服务之前是使用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工作。

下一篇
举报
领券