写点什么

Discord 团队使用 Rust 实现 Elixir 的性能扩展

  • 2019-07-08
  • 本文字数:867 字

    阅读完需:约 3 分钟

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


2019-07-08 08:004954
用户头像

发布了 391 篇内容, 共 155.7 次阅读, 收获喜欢 257 次。

关注

评论

发布
暂无评论
发现更多内容

Go1.17正式发布--切片转为数组指针

草原狼

Go 语言

使用账号密码来操作github? NO!

程序那些事

Java GitHub 程序那些事

linux工具之TC

webrtc developer

网络货运平台要智能,安全的数据底座少不了

华为云开发者联盟

数据库 华为云 物流 智慧物流 可视化追踪

七步实现列表点击事件的采集

神策技术社区

大前端 后端 代码

Android技术分享| 自定义ViewGroup实现直播间大小屏无缝切换

anyRTC开发者

android 音视频 实时通信 Android开发 大小屏切换

Vue进阶(四十):ref ($refs) 用法详解

No Silver Bullet

Vue 8月日更

【LeetCode】学生考勤Java题解

Albert

算法 LeetCode 8月日更

webrtc Rtp/rtcp (1)

webrtc developer

老板不让用 AFNetworking,我该怎么办?

神策技术社区

大前端 后端 数据 数据采集

价值连城 图灵奖得主Yoshua Bengio约书亚·本吉奥的采访 给AI从业者的建议 John 易筋 ARTS 打卡 Week 60

John(易筋)

ARTS 打卡计划

EMQ 映云科技成为开源项目 Vue.js 定期捐赠者

EMQ映云科技

Java 开源 大前端 emq

OPPO数据湖统一存储技术实践

安第斯智能云

大数据 数据湖 存储

用Python爬取《王者荣耀》英雄皮肤数据并可视化分析,用图说话

Python研究者

8月日更

史上最大DDoS攻击之争:这三次攻击,谁才是「最大」?

百度开发者中心

最佳实践 方法论 信息安全 案例分析 行业深度

MySQL 系列教程之(六)DML 操作:数据的增删改

若尘

数据库 MySQL 数据库 8月日更

Go语言chan实现原理,彻底搞懂chan读写机制

微客鸟窝

Go 语言 8月日更

大一一个学期学多少编程算正常?

沉默王二

编程

前端基础二之css篇

ベ布小禅

8月日更

如何理解 Java 多线程

HoneyMoose

如何找到程序崩溃的 “凶手” ?

神策技术社区

数据库 程序员 埋点

从“人工”到“人工智能”,聊一聊本届东京奥运会的AI黑科技

行者AI

LeetCode题解:217. 存在重复元素,哈希表,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Java 为什么设计成 String 不能用 == 来进行比较

HoneyMoose

webrtc AlrDetector

webrtc developer

centos8 mediasoup 搭建

webrtc developer

WebRTC mediasoup

MaxCompute执行引擎核心技术DAG揭秘

阿里云大数据AI技术

The Data Way Vol.2 | 做个『单纯』的程序员还真不简单

SphereEx

数据库 开源

解读短小精悍的 Then 框架

fuyoufang

ios swift 阅读代码 8月日更

千亿级模型在离线一致性保障方案详解

百度Geek说

百度 测试 后端

基于KubeEdge实现中国移动10086客服云边协同平台

华为云原生团队

云计算 开源 运维 边缘计算 边缘技术

Discord团队使用Rust实现Elixir的性能扩展_语言 & 开发_Sergio De Simone_InfoQ精选文章