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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索