写点什么

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:004800
用户头像

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

关注

评论

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

厉害了!阿里内部都用的Spring+MyBatis源码手册,实战理论两不误

小Q

Java spring 学习 面试 mybatis

直播卖货已成趋势

anyRTC开发者

音视频 WebRTC RTC

支撑2715​亿元海量订单 揭秘京东大促背后的数据库基石

京东科技开发者

数据库 数据仓库 云服务 云数据库

什么是服务器租用?

德胜网络-阳

6个JDK自带JVM调优工具,一次性打包给你说清楚

田维常

jvm调优

为什么容器内存占用居高不下,频频 OOM

996小迁

Java 架构 容器 面试 k8s

响应式关系数据库处理R2DBC

程序那些事

MySQL R2DBC 程序那些事 响应式系统 响应式数据库

2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕

阿里云CloudImagine

架构 云直播 直播 流媒体 直播架构

《程序员面试金典》.pdf

田维常

面试

有点意思的gif动图生成平台开发实战(二)

徐小夕

Java Vue 大前端 GIF React

Vokenization:一种比GPT-3更有常识的视觉语言模型

脑极体

甲方日常 52

句子

工作 随笔杂谈 日常

容器和虚拟机到底有啥区别?

网管

容器 虚拟机

影视剪辑类自媒体运营心得:如何抓住观众的痛点

石头IT视角

这才是图文并茂:我写了1万多字,就是为了让你了解AQS是怎么运行的

鄙人薛某

Java 并发编程 AQS 并发 ReentrantLock

超越竞争文化:致善式创新能否打造手机产业的“海法城”

脑极体

【JVM】肝了一周,吐血整理出这份超硬核的JVM笔记(升级版)!!

冰河

性能优化 内存模型 JVM 堆栈 JVM笔记

Java中NullPointerException的完美解决方案

Silently9527

java8 Optional

解读登录双因子认证(MFA)特性背后的TOTP原理

华为云开发者联盟

算法 totp 密钥

程序员如何判断跳槽岗位是否有坑!

Java架构师迁哥

这份算法攻略,我拿到了5个大厂的offer

yes

面试 算法 笔试

SQL数据库集合运算

正向成长

SQL表联结 SQL集合运算

区块链数字货币商城系统开发模式

薇電13242772558

区块链 数字货币

.net core增强工作流组件,基于稳定平台,多项目整合开发

雯雯写代码

基于Vue实现一个有点意思的拼拼乐小游戏

徐小夕

Java GitHub 开源 H5游戏 H5

SpringBoot-技术专题-Hystrix学习介绍

码界西柚

go-zero 如何扛住流量冲击(一)

万俊峰Kevin

microservice go-zero goctl Go 语言

读完某C++神作,我只记住了100句话

MySQL从删库到跑路

c++

Java中的线程与C++中的区别

jiangling500

Java c++ 线程

微服务架构中的“参天大树”:SpringBoot+SpringCloud+Docker

小Q

Java 学习 容器 面试 微服务

2020年底备战—从技术到面试合集

iOSer

ios 编程 面试

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