写点什么

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

  • 2019 年 7 月 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 年 7 月 08 日 08:003895
用户头像

发布了 387 篇内容, 共 106.7 次阅读, 收获喜欢 244 次。

关注

评论

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

一分钟搞懂FAST Agile

俞凡

敏捷 10月日更

数据结构与算法 - 复杂度

小马哥

数据结构与算法 日更

【Flutter 专题】三步搞定会转的饼状图

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 引航计划 10月日更

SpringMVC源码分析-HandlerAdapter(5)-SessionAttributesHandler组件分析

Brave

源码 springmvc 10月日更

一篇文章带你了解Android 最新Camera框架

小驰笔记

android 音视频 camera

漫游语音识别技术——带你走进语音识别技术的世界

攻城先森

深度学习 音视频 nlp 语音识别

【云原生】:一文读懂Docker核心技术

息之

Docker 云原生

004云原生之服务化架构

穿过生命散发芬芳

云原生 10月日更

在线图片水平/垂直均等切割工具

入门小站

工具

【Zookeeper技术专题】从Paxo算法出发认识一下Zookeeper

浩宇天尚

PAXOS ZooKeeper原理 paxos协议 10月日更 Paxo

🏆【Spring技术专题】「动态代理技术」Spring框架中Aspectj和LoadTimeWeaving的动态代理技术实现指南

浩宇天尚

spring aop 动态代理 10月日更 LTW

老式月饼是一块坚硬的乡愁

石君

自我成长 乡愁

管理者如何带团队?

石云升

团队管理 管理 引航计划 内容合集 10月日更

Object.defineProperty的缺点及Vue3为什么用Proxy

wudaxue

9月,一些感慨

程序员架构进阶

自我提升 管理者 软技能 总结思考 10月日更

SpringMVC源码分析-HandlerAdapter(4)-ModelAndViewContain组件分析

Brave

源码 springmvc 10月日更

ssh常用命令总结

入门小站

Linux

谈 C++17 里的 Strategy 模式

hedzr

c++ 设计模式 策略模式 Design Patterns c++17

【Flutter 专题】40 日常问题小结 (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月日更

1. 滚雪球学Python第四季开启,一需三吃,Python 函数式编程初识,面向过程,面向对象,函数式

梦想橡皮擦

10月日更

【LeetCode】删除无效的括号Java题解

HQ数字卡

算法 LeetCode 10月日更

学生管理系统 - 考试试卷存储方案

紫云

团队管理之如何成为核心员工

小诚信驿站

团队管理 管理 引航计划 内容合集

架构实战训练营|课后作业|模块5

Frode

「架构实战营」

JavaScript 中的文档对象模型 DOM

devpoint

CSS html DOM 10月日更

2. Python函数式编程中的字符串,元组,函数的分类,高阶函数,一篇文章都介绍一遍

梦想橡皮擦

10月日更

上次写作还是在上次之——WebRTC(一)

Zoomdaa

WebRTC

每天学习使用代码片段(八)

devpoint

JavaScrip 10月日更

模块9

gevin

架构实战营

微博系统中”微博评论“的高性能高可用计算架构

michael

#架构实战营

Minerva -- Airbnb的大规模数据指标系统 Part 3

俞凡

架构 Airbnb 大厂实践 指标 10月日更

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