BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Usando Elixir com Rust para melhorar o desempenho: A história do Discord

Usando Elixir com Rust para melhorar o desempenho: A história do Discord

A equipe do Discord atingiu o limite de desempenho da BEAM - a máquina virtual no centro da Erlang Open Telecom Platform (OTP), ao lidar com grandes estruturas de dados. Recorreram então ao Elixir com Rust para que o sistema conseguisse escalonar até 11 milhões de usuários simultâneos.

O Discord, fabricante da plataforma de aplicativos de voz sobre IP (VoIP) multiplataforma, é conhecida por usar o Elixir no limite da máquina virtual Erlang para dimensionar seus sistemas para até cinco milhões de usuários simultâneos. Recentemente, sua base de usuários cresceu para 11 milhões, e com milhões de eventos por segundo. Recentemente, o Discord tentou implementar uma otimização e com isso exigiu um desempenho maior do que o esperado e com grandes estruturas de dados que o Elixir e o BEAM pareciam ser capazes de fornecer.

A VM BEAM é bem rápida e fica mais veloz a cada dia. O sistema tenta tirar proveito das estruturas de dados persistentes quando possível, mas na escala em que operamos, essas listas gigantes não podem ser atualizadas com a rapidez necessária.

Especificamente, os engenheiros do Discord precisavam de uma estrutura de dados ordenada capaz de suportar um grande número de mutações concorrentes com a capacidade de devolver uma lista de índices afetados. Então, começaram a analisar quais estruturas de dados do Elixir poderiam atender a esses requisitos, incluindo MapSet, List e Ordset. Nenhum deles se mostrou adequado, especialmente quando se considera o pior desempenho em coleções de mais de 250.000 itens. Uma pesquisa semelhante conduzida entre pacotes de terceiros disponíveis também não teve bons resultados pelos mesmos motivos.

Neste ponto, os engenheiros do Discord adotaram uma abordagem completamente diferente usando uma Native Implemented Function (NIF) para alcançar o objetivo. NIFs é um mecanismo que permite o uso de código nativo de dentro da máquina virtual BEAM, como se fosse outra função interna do Elixir ou Erlang. Parecia uma escolha natural como linguagem para construir um NIF, graças à sua abordagem de "abstrações de custo zero" e suas fortes garantias de segurança que prometiam minimizar as chances de travar a VM, ou termos problemas de memory leak. Além disso, o ecossistema Rust já fornece uma biblioteca de código aberto para facilitar a escrever NIFs da BEAM usando Rust, chamada Rustler. O Rustler fornece recursos para gerar padrões, codificação e decodificação de interface além de gerenciamento de erros.

Após várias iterações, os engenheiros do Discord escreveram uma implementação Rust de um SortedSet que forneceu uma melhoria significativa de desempenho de 6.5x e uma enorme melhoria no desempenho do pior caso de 160x. O novo SortedSet foi posteriormente usado de maneira geral no Discord.

Este projeto mostrou como a Rust pode ser integrado com a VM da BEAM, proporcionando não apenas desempenho e segurança, mas também confiabilidade em escala, sem perder as vantagens da programação em uma linguagem funcional de alto nível, como o Elixir.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT