这一决策涉及将该服务的实现从Go语言转换为Rust语言。虽说Go语言以其并发性和简洁性而闻名,但Discord的工程师们遇到了性能瓶颈,因而有必要进行这种转换。本案例研究深入探讨了Discord选择Rust语言的原因、它如何改进了服务,以及Go语言和Rust语言的爱好者们能从这一转变中学到什么经验教训。“Read States”服务:一个...
Rust 与 Go 的根本区别在于内存管理。Rust 遵循无垃圾回收的编译时所有权模型,这意味着在变量超出作用域后,内存会立即释放。相比之下,Go 的垃圾回收机制会导致定期的性能抖动,这对于要求高实时性的应用而言,显然是不利的。 此外,Rust 的编译时检查确保了更高的内存安全性和并发性从一开始就避免了设计缺陷,进一步...
在高负载情况下,Go的GC周期性扫描内存的行为将加大延时,而Discord的具体实现依赖于一个大型的LRU(最近最少使用)缓存用于提升性能,但这也导致了内存占用增加,进一步加重了GC的负担。 即使尝试了调整GOGC环境变量和修改缓存大小等策略,Discord团队始终未能找到一个平衡点。经过深思熟虑后,他们将视线投向了Rust,这种语言在...
经过调查,Discord团队确定峰值是由于Go的核心功能引起的,就是内存模型和垃圾收集器(GC)。 迁移到Rust 读取状态服务之前大约每2分钟就会出现延迟和CPU峰值。经过Discord团队调查,Go会强制至少每2分钟运行一次GC。 随后团队不得不缩小了缓存容量,达到了某种平衡,不会频繁触发Go的垃圾回收,因此降低了延迟,从而继续使用了一...
Go is purple, Rust is blue. Go 是紫色的,Rust 是蓝色的。 提高缓存容量 在服务成功运行了几天后,我们决定是时候重新提高 LRU 缓存容量了。 在 Go 版本中,如上所述,提高 LRU 缓存的上限会导致更长的垃圾回收时间。 我们不再需要处理垃圾收集,因此我们认为我们可以提高缓存的上限并获得更好的性能。 我们增加...
Rust 速度极快且内存效率极高:无需运行时或垃圾回收器,它可以为性能关键型服务提供支持,在嵌入式设备上运行,并轻松与其他语言集成。 Rust 没有垃圾回收,所以我们认为它不会有与 Go 相同的延迟峰值。 Rust 使用相对独特的内存管理方法,该方法结合了内存"所有权"的概念。基本上,Rust 会跟踪谁可以读取和写入内存。
此时,Discord 在其软件堆栈的许多地方使用 Rust. 我们将其用于游戏 SDK, Go Live 的视频捕获和编码,Elixir NIF, 几个后端服务等. 在启动新项目或软件组件时,我们考虑使用 Rust. 当然,我们只在有意义的地方使用它. 除了性能,Rust 对于工程团队来说有很多优势。例如,它的类型安全和借用检查器使得随着产品需求的变...
Rust正在成为各种领域的一流语言。在Discord,我们已经在客户端和服务器端看到了Rust的成功。例如,我们在客户端将其用于Go Live的视频编码管道,在服务器端将其用于Elixir NIF。最
Rust正在成為各種領域的一流語言。在Discord,我們已經在客戶端和伺服器端看到了Rust的成功。例如,我們在客戶端將其用於Go Live的影片編碼管道,在伺服器端將其用於Elixir NIF。最近,我們透過將服務的實現從Go切換到Rust來極大地提高了服務的效能。這篇文章解釋了為什麼重新實現服務對我們有意義,它是如何完成的,以及...
為什麼 Discord 要從go轉換到rust 今天來講的更詳細一點 他們發現go程式每兩分鐘就會有一個延遲高峰 這個延遲高峰是因為go每兩分鐘就要清一次記憶體垃圾 這個問題出現在 go 1.9.2 也許最新版修掉了 不過已經對Discord沒有意義了 這次的測試是在 2019年5月進行的 ...