写点什么

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

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

关注

评论

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

SAP UI5 数据绑定中的工厂函数

汪子熙

SAP Fiori SAP UI5 ui5 11月月更

opensd开源啦 !这套自动化部署OpenStack工具你值得拥有

openEuler

开源 操作系统 openEuler OpenStack

MySQL事务底层原理和MVCC机制

闫同学

MySQL 数据库 MVCC 11月月更

湖仓一体电商项目(六):大屏可视化工具腾讯云图

Lansonli

湖仓一体电商项目 11月月更

灰度发布设计

星际行者

Vue基础学习(四)

Studying_swz

Vue 11月月更

Vue基础学习(五)

Studying_swz

Vue 11月月更

Java Web(五)Web

浅辄

tomcat javaWeb 11月月更

Redis Cluster 数据分片

月明风清

redis redis cluster 数据切片

设计模式之美-面向对象对比面向过程有哪些优势?面向过程过时了吗?

GalaxyCreater

设计模式

SpringMVC+Mybatis整合的增删改查

石臻臻的杂货铺

spring mybatis 11月月更

Python进阶(二十六)多线程实现同步的四种方式

No Silver Bullet

Python 多线程 11月月更

玩转MySQL表之间的各种连接查询

闫同学

MySQL 数据库 11月月更

湖仓一体电商项目(七):业务需求和分层设计及流程图

Lansonli

湖仓一体电商项目 11月月更

京东面试题:ElasticSearch深度分页解决方案

小小怪下士

Java 程序员 ES

Zebec Chain有望成为公链赛道新兴生力军,地平线计划持续进击

股市老人

涨姿势了,这 4 个场景可用 CSS 完全取代 JS ~

掘金安东尼

前端 11月月更

麒麟信安携手 openEuler 支撑国家电网首批数字换流站试点项目安全高效运行

openEuler

Python进阶(二十九)Python时间&日期&时间戳处理

No Silver Bullet

Python 日期处理 11月月更

湖仓一体电商项目(八):业务实现之编写写入ODS层业务代码

Lansonli

湖仓一体电商项目 11月月更

极客时间运维进阶训练营第三周作业

9527

Java实现List中集合的元素进行排序

共饮一杯无

Java List 11月月更

就这一次!带你彻底搞清MySQL行级锁的加锁规则

Java永远的神

MySQL 数据库 索引 Java 面试题

JVM 引用数据类型分析

Andy

Testbench 的编写与应用

芯动大师

Verilog 11月月更 testbench

Python进阶(二十五)Python读写文件

No Silver Bullet

Python 文件读写 11月月更

探知数字化研发1-前言篇

薛飞

数字化 软件研发

玩转子网划分和超网汇聚

闫同学

网络 子网划分 11月月更 超网汇聚

CSS学习笔记(六)

lxmoe

CSS 前端 学习笔记 11月月更

Zebec Chain有望成为公链赛道新兴生力军,地平线计划持续进击

鳄鱼视界

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