写点什么

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

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

关注

评论

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

数据大体系(四)——标签

圣迪

大数据 标签 标签体系 数据体系

尝试

Nydia

Dubbo 框架学习笔记三

风翱

dubbo 12月日更

Maven 如何打包 Spring Boot 项目

HoneyMoose

Maven 3 进行安装

HoneyMoose

关于分布式事务的思考

yuexin_tech

【docker 总结】第一篇 - docker 简介和安装

Brave

Docker 12月日更

8千长文解决前端资源下载全场景问题

梁龙先森

签约计划第二季

聊聊 Kafka: Consumer 源码解析之 ConsumerNetworkClient

老周聊架构

签约计划第二季

聊聊 Kafka: Consumer 源码解析之 Consumer 如何加入 Consumer Group

老周聊架构

签约计划第二季

Go+ 上下文处理教程(5.3)

liuzhen007

28天写作 12月日更

用 Go + Redis 实现分布式锁

万俊峰Kevin

微服务 高并发 分布式锁 go-zero Go 语言

NCF 如何对接三方的功能(五)

MartyZane

支付 短信 签约计划第二季 NCF DDD框架

Python Qt GUI设计:QScrollBar类实现窗口水平或垂直滑动条效果(拓展篇—4)

不脱发的程序猿

Python qt GUI设计 Qt Company 滑动条效果

每个前端都值得拥有自己的组件库,就像每个冬天都拥有春秋裤⛄️

速冻鱼

前端 组件库 签约计划第二季 12月日更

2021年最委屈的一件事

将军-技术演讲力教练

Prometheus Exporter (二十五)HAProxy Exporter

耳东@Erdong

Prometheus 28天写作 exporter 12月日更 HAProxy

NCF 实战应用合集全解析

MartyZane

实战 内容合集 签约计划第二季 NCF DDD框架

[Pulsar] Broker处理消息确认

Zike Yang

Apache Pulsar 12月日更

Maven 如何打包 Spring Boot 项目打包的发布 Jar 名字

HoneyMoose

Confluence 如何在页面中显示目录

HoneyMoose

NCF框架如何实现WebApi(四)

MartyZane

实战 签约计划第二季 NCF DDD框架 WebApi

C++软件开发中的时间

行者孙

c++ 签约计划第二季 chrono datetime iso8601

20行Python scrapy 代码,去采集【蓝桥】训练营

梦想橡皮擦

12月日更

C++构造那些事:三五O法则

行者孙

c++ 签约计划第二季

C++实现unique_ptr

行者孙

c++ DIY 签约计划第二季 unique_ptr

Python Qt GUI设计:QMdiArea和QMdiSubWindow类实现多文档界面(拓展篇—3)

不脱发的程序猿

Python qt GUI设计 Qt Company 多文档界面

使用golang开发数据库周边工具

lixiaofeng

签约计划第二季

线程方法:sleep( )、wait()、join( )、yield( )的区别

JavaEdge

C++ 三种智能指针的使用场景

行者孙

c++ smart pointer 签约计划第二季

C++的explicit关键字

行者孙

c++ 签约计划第二季 explicit

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