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

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