Discord團隊使用Rust實現Elixir的性能擴展

Discord團隊在BEAM虛擬機上處理大型數據結構時,性能上遇到了天花板。於是他們實現了Elixir的Rust接口,支持系統擴展到1100萬併發用戶

作爲一家多系統VoIP應用平臺的開發商,Discord的獨到技術是在Erlang虛擬機上使用Elixir,系統支持500萬併發用戶,同時可擴展到1100萬併發用戶,實現每秒處理百萬級事件。團隊近期致力於大型數據結構處理的優化。處理此類數據結構需要更高的性能,當前Elixir和BEAM難以支持。

儘管BEAM虛擬機的速度很快,並且每天都在改進,但是它通常儘可能使用持久數據結構。對於大型列表數據結構的更新,其性能難以滿足我們的需求。

具體而言,Discord的工程師需要一種支持大規模併發互斥(mutation)的有序數據結構,並能夠返回受影響的索引列表。他們着手分析Elixir中是否提供可滿足上述需求的數據結構,包括MapSet、List和Ordset等。但是現有的數據結構並不適合,尤其是考慮到最壞情況下需處理25萬條以上的條目。對現有第三方軟件包的研究,結果同樣令人失望。

由此,Discord的工程師另闢蹊徑,嘗試使用NIF(Native Implemented Function)技術達成目標。NIF是一種在BEAM虛擬機中支持像使用Elixir或Erlang內建函數一樣使用原生代碼的機制。Rust不僅具有“零代價抽象”方法,而且提供強安全保證,是支持構建NIF的不二選擇,可確保最小化由於BEAM虛擬機內存泄漏而導致崩潰的情況。此外,Rust生態系統已經提供了一些開源軟件庫,簡化了使用Rust和Rustler編寫BEAM NIF。Rustler提供了生成接口代碼模板(boilerplate)、編解碼和錯誤管理的機制。

簡而言之,Discord的工程師在經過數輪迭代開發後,用Rust編碼實現了SortedSet。該數據結構可實現性能6.5倍的提升,在最壞情況下可達到160倍的性能提升。新的SortedSet已成爲構建所有Discord用戶組(guild)的基礎。

Discord團隊的項目展示了Rust與BEAM虛擬機的高效集成能力。項目繼續使用Elixir等高級函數式語言,不僅提高了系統性能和安全,而且實現了可靠的大規模數據結構。

原文鏈接:

Scaling Up Elixir Using Rust at Discord

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章