限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

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

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

关注

评论

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

vue计算属性

小恺

6月月更

Teambition 协作应用心得分享|社区征文

北洋

初夏征文

1.5 什么是架构师(连载)

凌晞

架构 架构师

消息队列存储消息数据的 MySQL 表格

流火

深圳3月14日起全市停工停业7天居家办公心得|社区征文

老周聊架构

后疫情时代企业应对策略 6月月更 初夏征文 高效工具 高效沟通

企业架构的第一性原理

涛哥 数字产品和业务架构

企业架构

Android MaterialButton使用详解,告别shape、selector

yechaoa

android 6月月更 material design MaterialButton

从源码解析 MobX 响应式刷新机制

岛上码农

flutter ios 前端 安卓 6月月更

合理地配置线程池

急需上岸的小谢

6月月更

搭建前端监控,如何采集异常数据?

杨成功

架构 大前端 监控系统

OpenMAX (OMX)框架

程思扬

音视频 编解码

模块八

ASCE

spring4.1.8扩展实战之一:自定义环境变量验证

程序员欣宸

Java spring Spring Framework 6月月更

加强区块链技术司法应用

CECBC

Java—流 Stream

武师叔

6月月更

模块八:设计消息队列存储消息数据的MySQL表

jiaoxn

「架构实战营」

【LeetCode】查找和替换模式Java题解

Albert

LeetCode 6月月更

什么是数据驱动

奔向架构师

大数据 数据仓库 数据驱动 6月月更

测试基础之:单元测试

甜甜的白桃

单元测试 测试用例 6月月更

SDN系统方法 | 6. 网络操作系统

俞凡

架构 网络 sdn SDN系统方法

NixOS 22.05安装过程记录

sai

NixOS Nix

居家办公期间如何提升沟通效率|社区征文

北洋

初夏征文

前端食堂技术周刊第 40 期:HTTP/3、WebContainers 登陆 Firefox、Remix Conf 2022、VueConf US 2022

童欧巴

Vue 前端

【sql语句基础】——查(select)(单表查询)

写代码两年半

sql MySQL 数据库 数据库· 6月月更

模块八作业

天琪实刚亮

架构训练营

vue中mixins的使用方法和注意点

源字节1号

软件开发 前端开发

提升管道效率:你需要知道如何识别CI/CD管道中的主要障碍

龙智—DevSecOps解决方案

ci CD CloudBees CI/CD管道

Vue-7-计算属性和方法的区别

Python研究所

6月月更

leetcode 47. Permutations II 全排列 II(中等)

okokabcd

LeetCode 搜索 数据结构与算法

八大误区,逐个击破(2):性能差?应用程序少?你对云的这些担心很多余!

龙智—DevSecOps解决方案

Atlassian atlassian云版 Atlassian白皮书

逐向双碳:东数西算中的绿色需求与竞争焦点

脑极体

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